【问题标题】:Why does ",,," == Array(4) in Javascript?为什么 ",,," == Array(4) 在 Javascript 中?
【发布时间】:2012-06-09 22:41:33
【问题描述】:

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

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

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

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

返回“假”。所以为什么?我知道这是在 Javascript 中输入一些特殊的鸭子,但只是好奇是什么强调了这种行为。从 Zed Shaw 的优秀 presentation here btw 中收集到这一点。

【问题讨论】:

  • 除了 C 之外,很少有语言以程序员可见的方式使用零终止符。
  • 如果我可以问,是什么导致了这个发现?
  • @SomeKittens Zed Shaw 在我的问题中链接到的视频中明确提到了这一点(作为对 Javascript 的批评)。干杯!
  • @SomeKittens 这在(众所周知的)“wat”演讲中也提到过,展示了 Ruby 和 JavaScript 的一些怪癖destroyallsoftware.com/talks/wat
  • 这是始终使用=== 而不是== 的众多充分理由之一。

标签: javascript


【解决方案1】:

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

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

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

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

11.9.3 of the specification 部分描述了比较的工作原理。在那里你会看到(x == y):

8。如果 Type(x) 是 String 或 Number 并且 Type(y) 是 Object,
返回比较结果x == ToPrimitive(y)。

(数组是 JavaScript 中的对象)

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

【讨论】:

  • 好的,现在这一切对我来说都是有意义的。谢谢。
  • 这反过来又是因为数组字符串化就好像它们正在使用Array.join(",")
  • 你必须非常耐心才能用javascript编程
【解决方案2】:

内部进行

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

【讨论】:

    【解决方案3】:

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

    参见下面的 sn-p:

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

    【讨论】:

      【解决方案4】:

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

       ",,," == Array(4)
      
       ",,," == Array(4).toString()
      
       ",,," == ["", "", "", ""] // note 3 commas for 4 values
      
       ",,," == ["", "", "", ""].toString()
      

      都是相似的。

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          试试看

          Array(4)==Array(4)
          

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

          Array(4)===Array(4)
          

          你会得到 FALSE

          您知道null==nullnull===null 甚至undefined==undefinedundefined===undefined 返回 TRUE...所以...这有点晦涩...

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

          【讨论】:

          • ZEE, Array(4)==[,,,] 不会是真的。如果我们将对象与图元进行比较,那么对象将被转换为图元。这就是它调用 toString() 的原因。
          • array(x) 应该是构造函数的地址......无论如何,在一个系统中(不要打扰什么样的系统),=== 应该永远是真的!
          猜你喜欢
          • 1970-01-01
          • 2015-08-14
          • 2010-12-20
          • 2013-07-24
          • 2019-06-01
          • 2012-09-29
          相关资源
          最近更新 更多