为什么Javascript中的数字([])==0和数字({})==NaN?
我正在查看上的第一个表,想了解为什么,例如,为什么Javascript中的数字([])==0和数字({})==NaN?,javascript,Javascript,我正在查看上的第一个表,想了解为什么,例如,0=[]和0!={}。我假设这是因为Number([])==0和Number({})==NaN。然而,这一部分似乎是武断的。为什么空列表0和空对象aNaN?使用Number(某些对象)将使用给定对象的字符串表示。对于您的示例,字符串表示为: js> ({}).toString(); [object Object] js> [].toString(); js> 字符串'[object object]不能转换为数字,但空字符串'可以转
0=[]
和0!={}
。我假设这是因为Number([])==0
和Number({})==NaN
。然而,这一部分似乎是武断的。为什么空列表0
和空对象aNaN
?使用Number(某些对象)
将使用给定对象的字符串表示。对于您的示例,字符串表示为:
js> ({}).toString();
[object Object]
js> [].toString();
js>
字符串
'[object object]
不能转换为数字,但空字符串'
可以转换为数字。为了详细说明ThiefMaster的答案,我已经研究了ECMAScript的:
将字符串转换为数字时,将使用语法进行转换。具体而言,
StringNumericLiteral::[empty]
的数学值定义为0。事实上,任何空格都是0。当一个值是对象([],{}),另一个是数字或字符串时,运算符==使用Javascript中所有对象继承的内置转换方法将对象转换为基本值(本例中为数字):toString()和valueOf()
对于像{}这样的通用对象,使用valueOf,默认情况下它返回对象本身,即!=0
对于内置阵列,使用toString。应用于数组的此方法返回一个字符串,该字符串包含由逗号连接的所有元素。对于空数组,它返回一个空字符串“”
然后解释器将valueOf应用于该字符串;此方法对空字符串的返回值为0,因此[]==0。数组就是这样。类似于
][[][[123][[123][[123][][][][]]==123
@Kolink…但是什么原因使它起作用呢?(在==
中找不到的===
的什么规则正在被应用?@Kolink:你认为这很奇怪吗@pst:如果操作数不是同一类型(您可能知道),严格比较将返回false。但是在这种情况下,=
会将两个操作数都转换为数字。为什么标题引用的是==
,而正文使用的是=
?这个问题实际上问的是哪一个?但是为什么空字符串'
转换为0?在数字上下文中使用falsy值时转换为0是很常见的。空对象不是假的。@tskuzzy:因为它是这样定义的:“StringNumericLiteral::[Empty]的MV是0。”。对于那些懒得在PDF中搜索的人,请参见规范的相关部分。