打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
JavaScript中的隐式转换和!![]==true与[]==true的思考

1.问题:

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

为什么会出现这种情况?

2.解释

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

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

相等运算符(== ),两个操作数类型不同时,我们要进行转换。

3.我们对于上面问题一步步看

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

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

[]==true //结果是false

这里我们重点说说,相等运算符(==) 在遇到两个操作数类型不同的时候,要遵守的规则和类型转换:

1、如果-个值是null, 另一个是undefined,则它们相等

null == undefined //返回true 

2、如果一个值是数字,另一个是字符串,先将字符串转换为数字,然后使用转换后的值进行比较。

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

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

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

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

var obj = new Date();console.log(obj);//Wed May 10 2017 12:19:05 GMT+0800 (中国标准时间)console.log(obj.valueOf());//1494389910179var obj = new Date();console.log(obj);//Wed May 10 2017 18:20:05 GMT+0800 (中国标准时间)console.log(typeof obj);//objectconsole.log(obj.toString());//"Wed May 10 2017 18:20:05 GMT+0800 (中国标准时间)"console.log(typeof obj.toString());//string

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

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

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

好的,我们知道这些规则后,再来看行代码

[]==true //结果是false 

true 会转为1 ,[ ] 会转为 0 ,最后是比较的是 0 == 1,所以结果是false。

理解了上面的内容的话,那么

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

这行代码,也就好理解了 ,![ ] ,也就是 [] 先转为 布尔值(true),然后求反,就是false,false 转为数字就是0 ,[ ]转为数字就是0 ,最后就是 0 == 0 ,所以结果就是true。

4.总结

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

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

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

附注:学习完上面可以看看下面的第二篇文章

(![]+[])[+!![]- -+!![]- -+!![]]+({}+[])[+!![]]+(![]+[])[+!![]- -+!![]- -+!![]] //输出sos

参考文章:
https://segmentfault.com/a/1190000011853970
https://segmentfault.com/a/1190000011854066

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
JavaScript的toString()和valueOf()区别到底是什么
javascript 一 03 数据类型的转换
关于原生js的一些研究 - SegmentFault
JavaScript的类型、值和变量
【JavaScript 教程】运算符—比较运算符
58个面向 Web 开发人员的JavaScript技巧汇总
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服