启动您的解释器/控制台并尝试比较
> ",,," == Array(4)
True
为什么?起初,我想也许是因为您可以将“ ,,”看作是四个字符组成的数组,并带有一个'\ 0'终止符,这也许就是为什么,但是
> "..." == Array(4)
返回“ False”。所以为什么?我知道这是Java语言中鸭子输入的一些特质,但只是好奇是什么突出了这种行为。顺便说一下,Zed Shaw出色的演讲总结了这一点。
===而不是的许多良好原因之一==。
启动您的解释器/控制台并尝试比较
> ",,," == Array(4)
True
为什么?起初,我想也许是因为您可以将“ ,,”看作是四个字符组成的数组,并带有一个'\ 0'终止符,这也许就是为什么,但是
> "..." == Array(4)
返回“ False”。所以为什么?我知道这是Java语言中鸭子输入的一些特质,但只是好奇是什么突出了这种行为。顺便说一下,Zed Shaw出色的演讲总结了这一点。
===而不是的许多良好原因之一==。
Answers:
因为右侧操作数将转换为字符串,并且的字符串表示形式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。
Array.join(",")。
内部发展
",,," == Array(4).toString()
在进行比较之前,将数组与字符串进行比较会将数组强制为字符串。将空的4元素数组强制为字符串会产生该字符串。
我最初以为它是“原型”……但是经过一番调查,我得出了一个可悲的结论……
显然,这是内部的且晦涩难懂的js事情,没有太多逻辑...
试一试
Array(4)==Array(4)
而且没有强制类型...
Array(4)===Array(4)
你会得到FALSE
你知道null==null,null===null甚至undefined==undefined和undefined===undefined返回TRUE ...所以...这是一个有点模糊......
Array(4)==[,,,] 也应该是真的