用JavaScript解释这种类型的强制

用JavaScript解释这种类型的强制,javascript,type-coercion,Javascript,Type Coercion,我已经读到,当我们将对象与数字类型进行比较时,会发生强制。调用对象上的TopPrimitive,然后调用valueOf和toString(如果需要)。但我无法理解它在下面给出的代码中是如何工作的 [ null ] == 0 // true [ undefined ] == 0 // true [ ] == 0 // true [ "-0" ] == 0 // true [ fal

我已经读到,当我们将对象与数字类型进行比较时,会发生强制。调用对象上的TopPrimitive,然后调用valueOf和toString(如果需要)。但我无法理解它在下面给出的代码中是如何工作的

[ null ] == 0             // true
[ undefined ] == 0        // true
[ ] == 0                  // true
[ "-0" ] == 0             // true

[ false ] == 0            // false
[ true ] == 0             // false
为什么[false]==0为false而[null],[undefined]为true


因为调用
Number([false])
,这会导致
Number('false')
,返回
NaN
,而
'
(空白或仅空白)、
null
未定义
编号初始化为
0
编号
返回一个基本值

除了
null
undefined
之外,所有基元值都具有环绕基元值的对象等价物

正如Touffy在注释中指出的,在调用包装器之前,需要通过调用值上的
toString
来解析数组。一旦确定了字符串值,包装器将处理解析

Number([0])/[0]。toString()=>Number(“0”)=>0
数字([undefined])/[undefined]。toString()=>Number(“”=>0
数字([null])/[null].toString()=>Number(“”=>0
数字([false])/[false]。toString()=>Number(“false”)=>NaN
null
undefined
都是生成
Number
原语的有效参数,因为它们没有值。空白或空字符串也被视为空值。由于
'false'
false
(布尔)值的字符串值是非空且非数字的,因此您将得到
NaN

注意:这与整数解析的工作方式略有不同

parseInt('0')//0
parseInt(“”)//NaN
parseInt('false')//NaN

您可以在Chromium代码搜索中查看解析字符串的工作方式。

如果删除新的,则错误会稍微少一些
Number(x)
返回一个基元数,而
newnumber(x)
返回一个Number的实例。@Touffy我认为我的措辞更好。是的,好吧……除了缺少一个步骤,数组在被强制返回数字之前被强制为字符串。强制数组时,JavaScript只能做一件事:
toString
。默认情况下,它是
join
的别名。Array.join通常对每个项调用
toString
,但它对null和undefined有一个特殊的行为,这是不可装箱的:只输出一个空字符串。所以得到一个空字符串,强制为数字,变成零。而布尔函数有一个输出“真”或“假”的
toString
方法。