Invisible Characters

JavaScript

if (true) {
  console.log('incorrect statement');
}
if (true) {
  console.log('correct statement');
}

上面的这段代码,看上去两个 if 语句并无差别。但是在实际执行的过程中,却会发现,第一个 if 语句有语法报错,而第二个 if 语句却没有。TypeScript 给出的报错信息是:Invalid character.(1127)

“看上去”一样的代码,在解释器看来却非常不同。究其原因,是因为第一个 if 语句中,有一个“看不见”的字符:

console.log(`if (true) {`.charCodeAt(0));

执行上面的这段代码,会看到在 console 中输出 8。这里,8 是 Backspace 的 ASCII 码编号。在很多的文本编辑器中,这类特殊字符并不会显示出来,但对于解释器来说,这个字符确实真是存在的。(当然,并不是所有的文本编辑器都不会显示,比如把上面的代码复制到 Chrome DevTools 中,就会看到一个 🔴 符号,用于表示这个看不见的 Backspace)

这一类的特殊字符除了 Backspace 还有很多,比如 Unicode 中的零宽空格(U+200b)、左至右符号(U+200e)、右至左符号(U+200f)等。