我太渴望一种普遍适用的准则解释这一切:
console.log(NaN == NaN);
//false
这个好理解:NaN(not a number),不是一个数字,还可以是很多其它东西,所以不相等
console.log('' == '');
//true
这个也还好理解:空字符
等于 空字符
,如果不相等,它还能咋地?上天不成?
但下面这个就有点逆天了
console.log([] == []);
//false
空数组
不等于空数组
,你是想咋地?好像真的上天了,既然如此,我也没辙
曾经还以为,空数组
的boolean
值是false
,但实际是true
,这个还能接受:数组是object
,object
的boolean
值都是true
,只有null
的boolean
值是false
console.log(!![]);
//true
后记: 虽然这些知识都比较小众,但是却决定了逻辑判断
,选择了程序的走向,所以还是弄清楚为好。这么多东西肯定不可能全凭记忆,我太渴望一种普遍使用的准则来判断(准则肯定是有的,想想设计者的初衷),我不要:试验、根据结果作总结、推翻总结、再试验、再总结、再推翻总结、、、,这种大浪淘沙的过程太让人崩溃了。
静候您的指教:、、、
JS数据类型分为原始类型(Primitive)和对象类型(Object)两大类
原始类型(number、string、boolean等)的对比是比较值。
对象类型(array、object等)的==比较是比较引用,[]是字面量数组,是一个新的数组,两个数组的引用不同,所以不相等。
[] == ![]之所以为true,是因为这里做了很多隐式转换,在标准里是这样的
令A为左,B为右
B是对[]取非,先需要把B转成Boolean再取非,执行ToBoolean操作
[]是Object,ToBoolean结果是true,取非结果是false
TYPE(A)为 Object ,值为[]
TYPE(B)为 Boolean,值为false
两者TYPE不同,TYPE(A)的Object需要执行ToPrimitive操作,隐式转成原始类型
调用[].valueOf(),返回值为[],Type为Object,不是原始类型,抛弃
调用[].toString(),返回值为"",Type为String,是原始类型
TYPE(A)为 String, 值为""
TYPE(B)为 Boolean,值为false
两者TYPE不同,TYPE(B)需要自行ToNumber操作,隐式转换为Number
false隐式转换为Number 0
TYPE(A)为 String,值为""
TYPE(B)为 Number,值为0
两者TYPE不同,TYPE(A)需要执行ToNumber操作,隐式转换为Number
"" 隐式转换为Number 0
TYPE(A)为 Number,值为0
TYPE(B)为 Number,值为0
两者类型一样,都为简单类型,比较值,值相等
返回true
附上ToBoolean的对应表
ToNumber的对应表
其中String的ToNumber比较特殊,可以参见我的这篇写的内容https://zhuanlan.zhihu.com/p/...