前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >简单说 !![]==true 与 []==true 引发的思考

简单说 !![]==true 与 []==true 引发的思考

作者头像
FEWY
发布2019-05-26 21:31:40
7440
发布2019-05-26 21:31:40
举报
文章被收录于专栏:FEWYFEWY

说明

直接说出问题

代码语言:javascript
复制
!![] == true //结果是true 
[] == true   //结果是false 
![] == []    //结果是true

为什么会出现这种情况

解释

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

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

代码语言: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、如果一个值是数字,另一个是字符串,先将字符串转换为数字,然后使用转换后的值进行比较。

代码语言:javascript
复制
1 == "1" //1==1  //结果是true
2 == "1" //2==1  //结果是false

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

代码语言:javascript
复制
"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。

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

代码语言:javascript
复制
[] == 0      //返回结果是 true
![] == 0     //返回结果是 true
[] == ''     //返回结果是 true
!![] == ''   //返回结果是 false
'' == true   //返回结果是 false
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年08月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 说明
  • 解释
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档