还是时间啊,这个问题3年前,甚至更早,就有人分析过了,现在我只是在追赶别人。。。转行晚啊,少壮不努力,老大徒伤悲啊,真是深有感触
现在把自己弄懂得,记录下来,放在这里,网站不倒,至少自己的东西就不会消失,别人的文章总是靠不住的,说不定什么时候就打不开连接了
转到正文
1 .为什么[]==false 为true;
首先还要从js基础,toString和valueOf方法来判断
(1)都知道0==0;0 ==‘’
是因为,第一个就是相等,第二个是做了隐式转换(==情况下)
但是,怎么做的隐式转换.,是Number(”)转换为0,所以相等
0==''
//0==Number('') //true
但是,隐式转换只能转换原始值类型,[]可不是原始值类型,那是怎么实现的呢
(2)[]==0如何实现
这就用到前面说的toString和valueOf了
当判断中,发现有一边不是原始值类型,就会先调用valueOf方法进行转换
[].valueOf() //[]
发现valueOf转化完后,依然不时原始值类型,那继续用toString方法转换
[].toString()//""
转换完毕,发现转成了原始值类型”“;
下面继续用Number转换
Number("")==0 //true
(3) []==false
接上面,[]最终转化为””
但此时,”“==false,依然不可比较,左右两边会Number进行转换
Number('')==Number(false) //0==0 true;
经过层层转换,所以才最后判断出为true
- 扩展1,![]==false为什么为true
(1)首先,涉及到运算符优先级
js运算符优先级,点此处查看
因为!比==优先运算,所以先计算![]
在js中,空字符串(”),NaN,0,null, undefined,false这几个,其他返回的都是true
所有值转布尔类型都是true。一切对象都是真值,包括new Boolean(false)
所以![]为false, ![]==false为true;
3.扩展2 null==0;结果是什么
首先要确定,到做==比较的时候,都会把非原始值,转为原始值
null.valueOf会报TypeError,会继续null.toString还是TypeError
既然转不成功共,那必然,null==0为false,除了undefined和null本身外的值,都是false,
null==undefined //true
null===undefined //false 类型不同
可能还有理解不对的地方,留着以后发现问题,继续深入研究
附上别人的研究结果,可以去看看别人如何分析这方面