为什么 2 40 等于 42?

新手上路,请多包涵

当一位同事向我展示这行 JavaScript alerting 42 时,我感到很困惑。

 alert(2+ 40);

很快就会发现,看起来像减号的东西实际上是一个神秘的 Unicode 字符,具有明显不同的语义。

这让我想知道为什么在解析表达式时该字符不会产生语法错误。我还想知道是否有更多的角色像这样。

原文由 GOTO 0 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 313
2 个回答

阅读其他答案后,我编写了一个简单的脚本来查找 U+0000–U+FFFF 范围内所有行为类似于空格的 Unicode 字符。看起来,根据浏览器的不同,有 26 或 27 个,对 U+0085 和 U+FFFE 存在分歧。

请注意,大多数这些字符看起来就像一个普通的空白。

 function isSpace(ch)
{
    try
    {
        return Function('return 2 +' + ch + ' 2')() === 4;
    }
    catch(e)
    {
        return false;
    }
}

for (var i = 0; i <= 0xffff; ++i)
{
    var ch = String.fromCharCode(i);
    if (isSpace(ch))
    {
        document.body.appendChild(document.createElement('DIV')).textContent = 'U+' + ('000' + i.toString(16).toUpperCase()).slice(-4) + '    "' + ch + '"';
    }
}
 div { font-family: monospace; }

原文由 GOTO 0 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题