120

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

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

为什么?起初我想也许因为你可以把“,,”想象成一个由 '\0' 终止切片的四个字符的数组,这可能就是为什么,但是

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

返回“假”。所以为什么?我知道这是在 Javascript 中输入一些特殊的鸭子,但只是好奇是什么强调了这种行为。顺便说一句,从 Zed Shaw 的出色演示中收集到这一点。

4

6 回答 6

177

因为右手操作数被转换为字符串并且字符串表示Array(4),,,

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

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

> ['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.

于 2012-06-05T21:40:15.450 回答
31

尝试使用===. 在 Javascript 中使用==时,它会尝试转换变量,从而导致像这样的问题。控制台正在转换Array(4)为字符串表示形式(即Array(4).toString),即",,,". 逗号存在的原因是该.toString()函数将它们添加到数组中的单独项目中。

请参阅下面的片段:

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

于 2012-06-05T21:40:18.840 回答
31

在内部它正在运行

",,," == Array(4).toString()
于 2012-06-05T21:40:57.107 回答
18

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

 ",,," == Array(4)

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

 ",,," == ["", "", "", ""] // note 3 commas for 4 values

 ",,," == ["", "", "", ""].toString()

都是相似的。

==在比较值之前进行隐式类型转换,这可能会导致不可预测的结果。用于===检查类型和值。

于 2012-06-05T22:31:22.910 回答
5

将数组与字符串进行比较会在进行比较之前将数组强制转换为字符串。将一个空的 4 元素数组强制为一个字符串会产生该确切的字符串。

于 2012-06-05T21:41:00.507 回答
4

我一开始以为是“原型”的东西……但经过一番调查,我得出了一个悲伤的结论……

显然这是一个内部和更晦涩的 js 东西,没有太多逻辑......

试试看嘛

Array(4)==Array(4)

并且对类型也没有强制...

Array(4)===Array(4)

你会得到 FALSE

你知道的,null==null甚至null===null返回TRUE......所以......它有点晦涩......undefined==undefinedundefined===undefined

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

于 2012-06-07T21:56:22.250 回答