当一位同事向我展示这行 JavaScript alerting 42 时,我感到很困惑。
alert(2+ 40);
很快就会发现,看起来像减号的东西实际上是一个神秘的 Unicode 字符,具有明显不同的语义。
这让我想知道为什么在解析表达式时该字符不会产生语法错误。我还想知道是否有更多的角色像这样。
原文由 GOTO 0 发布,翻译遵循 CC BY-SA 4.0 许可协议
当一位同事向我展示这行 JavaScript alerting 42 时,我感到很困惑。
alert(2+ 40);
很快就会发现,看起来像减号的东西实际上是一个神秘的 Unicode 字符,具有明显不同的语义。
这让我想知道为什么在解析表达式时该字符不会产生语法错误。我还想知道是否有更多的角色像这样。
原文由 GOTO 0 发布,翻译遵循 CC BY-SA 4.0 许可协议
阅读其他答案后,我编写了一个简单的脚本来查找 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 许可协议
13 回答13k 阅读
2 回答7.2k 阅读✓ 已解决
7 回答2.2k 阅读
3 回答1.3k 阅读✓ 已解决
6 回答1.3k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
该字符是 “OGHAM SPACE MARK” ,这是一个空格字符。所以代码等同于
alert(2+ 40)
。Zs 类中的任何 Unicode 字符 在 JavaScript 中都是空白字符, 但似乎没有那么多。
但是, JavaScript 还允许在标识符中使用 Unicode 字符,这样您就可以使用有趣的变量名称,例如
ಠ_ಠ
。