[] == false 为什么是 True
参考
JS的隐式转换 [] ==false 说起 - 南辰_k - 博客园 (cnblogs.com)
首先很明显,在对比的时候,js 内部进行了隐式类型转换,并且在发生转换的时候,js 其实都是会将操作对象转化为原始的对象。ECMAScript 规范中有一个内部函数, ToPrimitive()
(JavaScript中不能访问)能实现这个功能。
ToPrimitive(input, [PreferredType])
input
表示要转换的内容, PreferredType
表示转换后的类型,它可以是 Number
或 String
,具体取决于其结果是希望转换成数字还是字符串。
转换步骤
- 如果
input
是原始值,返回这个值(没有其他需要做的)。 - 否则,如果
input
是对象,调用input.valueOf()
。 如果结果是原始值,则返回结果。 - 否则,调用
input.toString()
。如果结果是原始值,返回结果。 - 否则,抛出一个
TypeError
(说明将输入转换成原始值出错了)
原始值
undefined, null, booleans, numbers,strings, symbol
// 再来看一下 [] == false
[].valueOf() // [] 不是原始值
[].toString // ''
// '' == false
Number('') == Number(false)
// true