为什么在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==null
, null===null
甚至undefined==undefined
和undefined===undefined
返回TRUE …所以…这有点模糊…
Array(4)==[,,,]
应该是真的