Mic*_*ski 6 javascript unicode language-features language-design referenceerror
var te?st = 1
console.log(test)
Run Code Online (Sandbox Code Playgroud)
尝试运行这个简单的代码.它给出了错误:ReferenceError: test is not defined
尽管我定义了该变量.为什么会这样?
Mic*_*ski 25
在变量声明中,变量名称包含零宽度非连接符(ZWNJ)字符(在e
和之间s
),它是不可见的,因为它的宽度等于零.但是,ECMAScript规范允许将此字符作为变量名称的一部分.
但是,在console.log()
通话中,只有test
没有任何特殊字符.因此,它抛出引用错误,因为变量名称te<ZWNJ>st
不是test
.
幸运的是,有一种简单的方法可以检查变量名是否包含这些字符.您可以将代码粘贴到JS Bin或JS Fiddle中 - 它们在红色背景上用白点表示这些字符.这就是JS Fiddle的样子:
我认为某些IDE中也有类似的功能.
旁注:这是一种有趣的方法,可以防止人们将您在答案中使用的代码段复制粘贴到自己的代码中.请考虑以下代码段:
// Warning: non-copy-pastable, it won't work if you copy it into your code.
function a?dd(a, b) {
return a + b
}
console.log(a?dd(2, 3))
Run Code Online (Sandbox Code Playgroud)
函数名和函数调用中有一个ZWNJ字符,所以它在这里工作.但是,如果有人将该函数复制到他们的代码中,然后手动输入console.log(add(3, 4))
,它就会抛出ReferenceError: add is not defined
.
请不要认真对待上述内容,这相当于一个笑话而非实际用途.