为什么Javascript中的",,,"== Array(4)?

Zen*_*hat 118 javascript

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

> ",,," == Array(4)
True
Run Code Online (Sandbox Code Playgroud)

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

> "..." == Array(4)
Run Code Online (Sandbox Code Playgroud)

返回"False".所以为什么?我知道这是Javascript中的一些特殊的鸭子输入,但只是好奇是什么强调了这种行为.从Zed Shaw 在这里的精彩演讲中收集到了这一点.

Fel*_*ing 178

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

> Array(4).toString()
  ",,,"
Run Code Online (Sandbox Code Playgroud)

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

> ['a','b','c'].toString()
  "a,b,c"
Run Code Online (Sandbox Code Playgroud)

比较如何工作在说明书的11.9.3节中描述.你会看到(x == y):

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

(数组是JavaScript中的对象)

如果你按照这个ToPrimitive方法,你最终会发现它调用它toString.

  • 反过来,这是因为数组stringify就像使用`Array.join(",")`. (6认同)
  • 很好的答案,非常精确. (3认同)
  • 好的,现在这一切都对我有意义.谢谢. (2认同)

Som*_*ens 31

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

请参阅下面的代码:

document.write( Array(4).toString() );
Run Code Online (Sandbox Code Playgroud)


Jas*_*nga 31

内部正在进行中

",,," == Array(4).toString()
Run Code Online (Sandbox Code Playgroud)


Kei*_*ith 18

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

 ",,," == Array(4)

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

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

 ",,," == ["", "", "", ""].toString()
Run Code Online (Sandbox Code Playgroud)

都是相似的.

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


Rus*_*ove 5

在进行比较之前,将Array与字符串进行比较会将Array强制转换为字符串.将空的4元素数组强制转换为字符串会产生精确的字符串.