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