Javascript:奇怪的比较行为

Javascript: strange comparison behaviour

本文关键字:比较 Javascript      更新时间:2023-09-26

如果我在FireBug控制台中执行以下代码片段,它会以某种方式打印surprise!

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

但是为什么?

UPD

对不起,人们,这是一个笑话!杰尔是第一个注意到的人!昨天我在字符串中发现了一个零宽度空间,从那时起就很想找点乐子=(

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

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

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

0=="​"

输出

0==""

输出为真

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

0=="​"false(因为字符串中有非打印字符(,Number(false)0的(根据规范的第 34 页(,"惊喜"是数组的第 0 个索引。

ES5 11.9.3 ==运算符

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

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

因此,0==""返回0 == ToNumber("")这是0 == 0哪个是真的。

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

ES5

15.7.1.1 数字(值(调用 ES5 9.3 到数字toNumber(true) === 1

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

为什么是正确的?因为

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

字符串

文本不是空字符串。字符串中的空格为零。

现在,如果我们回到ES5 11.9.3 ==运算符,我们看到

如果语法无法将字符串解释为 StringNumericLiteral 的扩展

这意味着

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

['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

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