说明

直接说出问题

!![] == true //结果是true
[] == true   //结果是false
![] == []    //结果是true

为什么会出现这种情况

解释

首先说一下,如果你看到这些代码,能想到 相等运算符(== ),两个操作数类型不同时,进行的转换,那么你已经接近答案了。

不要浪费时间,我们需要先知道在JavaScript中的一些比较特别的类型转换,最好能记住哦!!!

[] 转为字符串是 ""       // String([]) 返回""
[] 转为数字是 0         // Number([]) 返回0
[] 转为布尔值是 true     // Boolean([]) 返回true
true 转为数字是 1       // Number(true) 返回1
false 转为数字是 0      // Number(false) 返回0

如果想知道为什么,请点这里。
简单说 JavaScript中的tostring( ) 与 valueOf( )方法

我们一句一句的看

!![] == true //结果是true
! (逻辑非),会将操作数的布尔值求反,而!! 就是类型转换,将对应的类型转换为boolean型
所以我们看一看,[ ]一次求反 (![]) 返回的就是false,再求反(!![]) 返回的就是true。
最后的比较就变成 true == true 自然结果是 true

[]==true //结果是false
这里我们重点说说,相等运算符(==) 在遇到两个操作数类型不同的时候,要遵守的规则和类型转换
1、如果-个值是null, 另一个是undefined,则它们相等
null == undefined //返回true
2、如果一个值是数字,另一个是字符串,先将字符串转换为数字,然后使用转换后的值进行比较。

1 == "1" //1==1  //结果是true
2 == "1" //2==1  //结果是false

3、如果其中一个值是true,则将其转换为1再进行比较。如果其中一个值是false,则将其转换为0再进行比较。

"1" == true  //1==1 结果是true
0 == false    //0==0 结果是true

4、如果一个值是对象,另一个值是数字或字符串,则将对象转换为原始值,然后再进行比较。对象通过toString()方法或者valueOf()方法转换为原始值,JavaScript语言核心的内置类先尝试使用valueOf(),再尝试使用toString(),除了日期类,日期类只能使用toString()转换,那些不是JavaScript语言核心中的对象则通过各自的实现中定义的方法转换为原始值。

原始值:不可变更的值,包括undefined、null、布尔值、数字、和字符串。

所有的对象都有toString()valueOf()这两个方法。
toString()方法的作用是,返回一个反映这个对象的字符串。
valueOf()方法的作用是,一个对象那个如果存在任意原始值,它就默认将对象转换为表示它的原始值。

5、其他不同类型之间的比较均不相等。

好的,我们知道这些规则后,再来看行代码
[]==true //结果是false
true 会转为1
[ ] 会转为 0
最后是比较的是 0 == 1,所以结果是false

理解了上面的内容的话,那么
![] == [] //结果是true
这行代码,也就好理解了
![ ] ,也就是 [] 先转为 布尔值(true),然后求反,就是false,false 转为数字就是0
[ ]转为数字就是0
最后就是 0 == 0 ,所以结果就是true

总结

强调一点,[ ] 转数字 是0,转布尔值,是true,但是这不是说, 0 转为布尔值是true,而是false,是false,false。

这篇文章主要是说一些关于隐式转换的事。
根据上面的三行代码,还能写出一些其他的来,看看下面这些有趣的代码吧。

[] == 0      //返回结果是 true
![] == 0   //返回结果是 true
[] == ''     //返回结果是 true
!![] == ''   //返回结果是 false
'' == true   //返回结果是 false

文章不长主要是想说清楚,最开始提到的问题。
最后推荐两篇相关的文章,希望对大家有所帮助。
简单说 JavaScript中的tostring( ) 与 valueOf( )方法
简单说 通过JS的隐式转换,关键时刻救你一命

简单说 !![]==true 与 []==true 引发的思考 1相关推荐

  1. 由一行文本输入框引发的思考

      文章是关于React组件之表单单行文本输入框的一些思考.可能大家第一反应都是,不就是一行<input/>嘛,没什么特别的吧?如果说到输入框的值的话,可能圈子里上大多数封装好的React ...

  2. Spring之LoadTimeWeaver——一个需求引发的思考---转

    原文地址:http://www.myexception.cn/software-architecture-design/602651.html Spring之LoadTimeWeaver--一个需求引 ...

  3. mysql gtid 还是pxc_记一次 PXC 集群拆分引发的思考

    原标题:记一次 PXC 集群拆分引发的思考 作者简介 冷正磊 2018年2月加入去哪儿网 DBA 团队,主要负责机票业务的 MySQL 和 Redis 数据库的运维管理工作,以及数据库自动化运维平台部 ...

  4. int.TryParse非预期执行引发的思考 ASP.NET -- WebForm -- 给图片添加水印标记 Windows -- 使用批处理文件.bat删除旧文件...

    int.TryParse非预期执行引发的思考 问题出现 这天在写一个页面,想谨慎些就用了int.TryParse,结果出问题了. 代码如下: Copy int id = 1000; //Request ...

  5. 一个小程序引发的思考

    既然是一个小程序引发的思考,那么我们就先看看这个小程序,看看他有何神奇之处: namespace ConsoleApplication1 {class Program{static void Main ...

  6. 由熊猫烧香引发的思考

    由熊猫烧香引发的思考 早期的计算机病毒诞生,作者是以技术炫耀为主,编写这类病毒需要更深入的了解系统及网络技术,开发功底也要更深厚.现阶段,一个合格的程序员,制造出具备破坏性的代码,已经不怎么难.甚至, ...

  7. 由SecureCRT引发的思考和学习

    由SecureCRT引发的思考和学习 http://mp.weixin.qq.com/s?__biz=MzAxOTAzMDEwMA==&mid=2652500597&idx=1& ...

  8. dynamic-insert=true dynamic-update=true,插入默认值的情况

    今天在做一个OA的简单增删除该查的时候,有一个时间类型的字段(数据插入时间),本身想着,这个字段直接中Oracle数据库设置一个Default Value ,就不用再前台install这个字段的值了, ...

  9. C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质...

    C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质 事情的经过是这种,博主在用C写一个简单的业务时使用递归,因为粗心而忘了写return.结果发现返回的结 ...

  10. 由「Metaspace容量不足触发CMS GC」从而引发的思考

    转载自  由「Metaspace容量不足触发CMS GC」从而引发的思考 某天早上,毛老师在群里问「cat 上怎么看 gc」. 好好的一个群 看到有 GC 的问题,立马做出小鸡搓手状. 之后毛老师发来 ...

最新文章

  1. 为什么下一个SaaS公司绝不会效仿Salesforce?
  2. 如何利用大数据做金融风控? 原创 2016年11月24日 17:42:03 标签: 大数据 / 金融 / 风控 1594 导语:如何通过海量数据与欺诈风险进行博弈? 随着金融科技、科技金融等概念的
  3. arm linux 识别新硬盘_嵌入式Linux系列第13篇:USB摄像头拍照
  4. asp.net core自定义依赖注入容器,替换自带容器
  5. ubuntu linux theme,如何在Ubuntu 20.04中启用全局暗黑主题
  6. VS2017安装或卸载错误1303
  7. 华为删除dhcp地址池_配置设备作为DHCP中继示例
  8. Photoshop和WPF双剑配合,打造炫酷个性的进度条控件
  9. 本科毕业论文降低查重率小技巧
  10. 【实习周报】2019年6月 前端开发实习工作周报汇总
  11. springcloud @ComponentScan 多模块 扫描其他模块
  12. 用max的角度来解析blender建模!
  13. openCV学习资料整理
  14. Excel技能培训之六-定位功能,隔行插入删除空行,分组插入空行,高亮行列间差异,复制筛选后的数据
  15. python在匿名函数作和_python内置函数和匿名函数
  16. 使用html2canvas和jspdf把网页保存pdf并下载
  17. 20世纪最伟大的十大算法
  18. C++学习笔记(更新)
  19. 7-2 查找书籍 (20 分)
  20. Windows平台RTMP、RTSP播放器录像模块精细化控制

热门文章

  1. 自动爬取ZiMuZu的内容发布到Wordpress
  2. 真·屠龙之术 | 一次SparkSQL性能分析与优化之旅及相关工具小结
  3. easypoi 实现任意格式的Excel导出(基于模板实现)
  4. PAT乙级刷题/1094 谷歌的招聘/C++实现
  5. 5 个好用且免费的在线代码编辑器
  6. 阿里RocketMQ创始人首次分享出这份RocketMQ技术神级架构手册
  7. 计算机专业学生u盘32g够用吗,32gu盘可以存多少首歌
  8. FCN全卷积网络—upsampling(上采样)——OpenCV图像金字塔
  9. 一幅画是不是真迹?AI比专家看得更明白
  10. python怎么爬取电影海报_Python 爬虫“王者”:豆瓣海报爬取