【问题标题】:Javascript: strange comparison behaviourJavascript:奇怪的比较行为
【发布时间】:2012-01-19 14:10:40
【问题描述】:

如果我在 FireBug 控制台中执行以下 sn-p,它会以某种方式打印 surprise!:

['surprise!', 'boring'][Number(0=="​")]

但是为什么呢?

UPD

对不起,各位,那是个玩笑! Jere是第一个注意到的人!昨天我在一个字符串中发现了一个ZERO WIDTH SPACE,从那以后我就想找点乐子=)

【问题讨论】:

  • @micha,注意==,而不是===
  • 不,他的萤火虫会识别错误并修复它们。
  • 我为参与感到羞耻……至少我猜我们学到了一些小知识
  • @Jere,很抱歉,我不认为你受了这么大的伤害。现在至少你知道在调试期间可以找到哪里
  • 是的。你是怎么跑到零宽度空间的?

标签: javascript


【解决方案1】:

引号之间有一个额外的、不可见的字符。

如果你输入这个,你会觉得“无聊”,因为 0=="" 计算结果为真,Number(true) 计算结果为 1。

粘贴这两个并观察不同的输出:

0=="​"

输出 false

0==""

输出 true

我唯一改变的是删除""之间的字符。

【讨论】:

  • 是的,杰尔是对的。在某处复制并粘贴行,然后使用键盘箭头移动,您会注意到一个额外的停止。它可能是非常小的空间
  • 我最初打算输入与其他人相同的答案......但注意到了黑魔法。 :)
  • 好地方。当我将它粘贴到 chrome 控制台并返回 0 时,我确实认为它是错误的。但从来没有 twigged :(
【解决方案2】:

0=="​"false因为你的字符串中有一个非打印字符),Number(false)0(根据page 34 of the spec),还有“惊喜”是数组的第 0 个索引。

【讨论】:

    【解决方案3】:

    ES5 11.9.3 The == operator

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

    StringNumericLiteral ::: [empty]的MV为0。

    所以0=="" 返回0 == ToNumber("") 这是0 == 0 这是真的。

    ==转换规则0==""true

    ES5 15.7.1.1 Number ( value ) 调用 ES5 9.3 toNumber toNumber(true) === 1

    ["suprize!", "boring"][1] 返回"boring",这显然是不正确的。

    为什么是正确的?因为

    "​".charCodeAt(0) === 8203

    您的字符串文字不是空字符串。你的字符串中有一个zero width space

    现在如果我们回到ES5 11.9.3 == operator,我们会看到

    如果语法不能将 String 解释为 StringNumericLiteral 的扩展

    这意味着

    • 0==""
    • 0==NaN
    • false
    • toNumber(false) === 0
    • Number(0=="") === 0
    • ["suprize!", "boring"][0] === "suprize!"

    【讨论】:

      【解决方案4】:

      ['surprise!', 'boring'][Number(0=="​")] 将返回“无聊”,因为您的代码:

      Number(0=="​") //returns true
      

      但是您的代码不同,您的文本中有一个不可见的字符,这就是返回 false 的原因。

      如果您正确编写代码,将返回 true,结果将是 boring,正如预期的那样。

      但是如果复制并粘贴您的代码,将返回 false,这就是为什么您在“​”之间有一个字符(您可以使用键盘或“​”.length 检查)

      所以您的代码将返回 false,即 0 然后返回“惊喜!”

      你在骗人:P

      ['surprise!', 'boring'][Number(0=="​")]
      
      "​".length //returns 1 ;)
      
      "​" != "" // OH GOD THIS IS TRUE :P
      

      【讨论】:

        【解决方案5】:

        在控制台中运行它时我会感到无聊 console.log(['surpeise!','无聊'][Number(0=="")])

        【讨论】:

          猜你喜欢
          • 2014-08-14
          • 1970-01-01
          • 1970-01-01
          • 2018-12-25
          • 2017-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-02
          相关资源
          最近更新 更多