为什么在JavaScript中“,,,”==数组(4)?

启动您的解释器/控制台并尝试比较

> ",,," == Array(4) True 

为什么? 起初我以为也许因为你可以把“,,,”看作一个由'\ 0'结尾的四个字符组成的数组,这可能是为什么,但是

 > "..." == Array(4) 

返回“False”。 所以为什么? 我知道这是在Javascript中input一些特殊的鸭子,但只是好奇这是什么强调这一行为。 从Zed Shaw 在这里btw出色的介绍中收集到的。

因为右边的操作数被转换成了一个string,并且Array(4)的string表示是,,,

 > Array(4).toString() ",,," 

如果使用数组构造函数并传递一个数字,它将数组的长度设置为该数字。 所以你可以说你有四个空索引(与[,,,]相同),数组的默认string表示是一个逗号分隔的元素列表:

 > ['a','b','c'].toString() "a,b,c" 

规范的第11.9.3节描述了比较的工作原理。 在那里你会看到( x == y ):

8.如果Type( x )是String或Number,Type( y )是Object,
返回比较结果x == ToPrimitive ( y )。

(数组是JavaScript中的对象)

如果你遵循ToPrimitive方法,你最终会发现它调用了toString

尝试使用=== 。 当在Javascript中使用==时,它将尝试转换variables,从而导致类似这样的问题。 控制台将Array(4)转换为string表示forms(即Array(4).toString ),即",,," 。 逗号存在的原因是.toString()函数将它们添加到数组中的单独项目中。

看下面的代码片段:

 document.write( Array(4).toString() ); 

在内部去

 ",,," == Array(4).toString() 

这是因为Array(4)初始化了一个4个空值的数组, ==隐式转换,所以:

  ",,," == Array(4) ",,," == Array(4).toString() ",,," == ["", "", "", ""] // note 3 commas for 4 values ",,," == ["", "", "", ""].toString() 

都是相似的。

==在比较值之前进行隐式types转换,这会导致不可预知的结果。 使用===检查types和值。

将数组与string进行比较,在比较之前将数组强制转换为string。 将空的4元素数组强制转换为string会生成确切的string。

我首先以为是“原型”,但经过一番调查,我得出了一个可悲的结论。

显然这是一个内部和更晦涩的事情,没有太多的逻辑…

你试一试

 Array(4)==Array(4) 

也没有强制types也…

 Array(4)===Array(4) 

你会得到FALSE

你知道null==nullnull===null甚至undefined==undefinedundefined===undefined返回TRUE …所以…这有点模糊…

Array(4)==[,,,]应该是真的