为什么 2+ 40 等于 42?
2022-08-29 23:41:29
当一位同事向我展示这行JavaScript警报42时,我感到困惑。
alert(2+ 40);
很快发现,看起来像减号的东西实际上是一个晦涩难懂的Unicode字符,具有明显不同的语义。
这让我想知道为什么在解析表达式时该字符不会产生语法错误。我也想知道是否还有更多角色表现得像这样。
当一位同事向我展示这行JavaScript警报42时,我感到困惑。
alert(2+ 40);
很快发现,看起来像减号的东西实际上是一个晦涩难懂的Unicode字符,具有明显不同的语义。
这让我想知道为什么在解析表达式时该字符不会产生语法错误。我也想知道是否还有更多角色表现得像这样。
该字符是“OGHAM空格标记”,这是一个空格字符。所以代码等效于 。alert(2+ 40)
我也想知道是否还有更多角色表现得像这样。
Zs类中的任何Unicode字符都是JavaScript中的空格字符,但似乎没有那么多。
但是,JavaScript 还允许在标识符中使用 Unicode 字符,这允许您使用有趣的变量名称,如 .ಠ_ಠ
在阅读了其他答案之后,我写了一个简单的脚本来查找 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; }