为什么 2+ 40 等于 42?

2022-08-29 23:41:29

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

alert(2+ 40);

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

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


答案 1

该字符是“OGHAM空格标记”,这是一个空格字符。所以代码等效于 。alert(2+ 40)

我也想知道是否还有更多角色表现得像这样。

Zs类中的任何Unicode字符都是JavaScript中的空格字符但似乎没有那么多

但是,JavaScript 还允许在标识符中使用 Unicode 字符,这允许您使用有趣的变量名称,如 .ಠ_ಠ


答案 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; }