· 539 words · 3 min
词法规定了语言的最小语义单元 token。词法技术分析上可以使用正则表达式或者状态机来进行。 JS 中,源代码中的输入可以分为几类:
JS 除了常见的空格,还可以支持更多的空白符号:
<HT>/<TAB>
:U+0009,缩进 TAB 符,也就是字符串中的 \t
。<VT>
:U+000C,垂直方向 TAB,\v
。<FF>
:U+000C,分页符,\f
。<SP>
:U+0020,常见的普通空格。<NBSP>
:U+00A0,非断行空格(no break space),HTML 中的
。<ZWNBSP>
:U+FEFF,零宽非断行空格,在 Web 编辑器应用中,用这个字符做隔断。JS 中提供了四种字符作为换行符:
<LF>
:U+000A,普通换行符,\n
。<CR>
:U+000D,真正意义上的“回车”,\r
,部分 Windows 文本编辑器中,换行是 \r\n
。<LS>
:U+2028,Unicode 中的行分隔符。<PS>
:U+2029,Unicode 中的段落分隔符。大部分换行符被词法分析器分析之后被丢弃。但换行符会影响到 JS 的两个重要特性:自动插入分号和 no line termonator 规则。
IdentifierName 可以使用 $
、_
或 Unicode 字母开始。IdentifierName 的任何字符都可以使用 JS 的 Unicode 转义写法。
var \u0024\u006A\u0073\u005F = 'javascript'
console.log(\u0024\u006A\u0073\u005F) // 'javascript'
console.log('\u0024\u006A\u0073\u005F') // '$js_'
JS 中的数字支持十进制、二进制、八进制和十六进制的整数。十进制的数字可以带小数,小数点前后部分都可以省略,但不能同时省略。
console.log(.01) // 0.01
console.log(10.) // 10
console.log(10.01) // 10.01
console.log(.) // 不会打印出 0,而是 Uncaught SyntaxError: Unexpected token '.'
因此,1.toString()
中,词法分析将这个语句拆为了 1.
和 toString()
,
因此报错 Uncaught SyntaxError: Invalid or unexpected token
,为了让词法分析器正确的拆分,
可以多加一个 .
,这样第一个 .
被当做小数点,而第二个 .
被认为是从临时的装箱对象上获取 toString
方法。
这是在 Edge 浏览器的控制台打印出的结果。如果你观察够仔细的话,你会发现第一个 .
是蓝色的,而第二个 .
是黑色的。