Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Javascript中的数字([])==0和数字({})==NaN?_Javascript - Fatal编程技术网

为什么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
和空对象a
NaN

使用
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中搜索的人,请参见规范的相关部分。