为什么 JavaScript 中的 “,,,” == Array(4)

Why does ",,," == Array(4) in JavaScript?

本文关键字:Array JavaScript 中的 为什么      更新时间:2023-09-26

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

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

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

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

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

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

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

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

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

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

8. 如果 Type(x) 是字符串或数字,而 Type(y) 是 对象,
返回比较结果 x == ToPrimitive(y)。

(数组是 JavaScript 中的对象)

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

尝试使用 === . 在 JavaScript 中使用 == 时,它会尝试转换变量,从而导致这样的问题。 控制台正在Array(4)转换为字符串表示形式(即 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()

都差不多。

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

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

我最初以为是"原型"的东西......但经过一番调查,我得出了一个可悲的结论......

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

试试吧

Array(4)==Array(4)

也没有对类型进行胁迫...

Array(4)===Array(4)

你会得到假的。

你知道null==nullnull===null甚至undefined==undefinedundefined===undefined返回TRUE...所以。。。有点晦涩难懂...

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