JavaScript词法:为什么12.toString会报错?
词法
词法规定了语言的最小语义单元:token,可以翻译成“标记”或者“词”。
JavaScript源代码中可以这么分类:
WhiteSpace 空白字符
LineTerminator 换行符
Comment 注释
Token 词
- IdentifierName 标识符名称,常见的就是变量名,关键字也包含在内
- Punctuator 符号,运算法和大括号等符号
- NumericLiteral 数字直接量,就是常见的数字
- StringLiteral 字符串直接量,就是常见的用单引号或双引号引起来的直接量。
- Template 字符串模版,用反引号` 括起来的直接量。
JavaScript特别之处:
"/","/=","/123/"
空白符号 Whitespace
<HT>(或称<TAB>)是U+0009,Tab符,\t
<VT>是U+000B,垂直方向Tab符,\v
<FF>是U+000C,Form Feed,分页符,\f
<SP>是U+0020,普通的空格
<NBSP>是U+00A0,非断行空格,是SP的变体;HTML中, 最后生成是它。
<ZWNBSP>(旧称<BOM>)是U+FEFF,ES5新增加入的空白符,是Unicode中的零宽非断行空格。
换行符 LineTerminator
JavaScript中只提供了4种字符作为换行符。
<LF>
<CR>
<LS>
<PS>
<LF>是U+000A,就是最正常换行符,在字符串中的\n。
<CR>是U+000D,回车,在字符串中是\r。
<LS>是U+2028,是Unicode中的行分隔符。
<PS>是U+2029,是Unicode中的段落分隔符。
注释 Comment
JavaScript的注释分为单行注释和多行注释两种:
/* MultiLineCommentChars */
// SingleLineCommentChars
除了四种LineTerminator之外,所有字符都可以作为单行注释。
标识符名称 IdentifierName
IdentifierName可以以美元符“$”、下划线“_”或者Unicode字母开始,除了开始字符以外,IdentifierName中还可以使用Unicode中的连接标记、数字、以及连接符号。
符号 Punctuator
{ ( ) [ ] . ... ; , < > <= >= == != === !== + - * % ** ++ -- << >> >>> & | ^ ! ~ && || ? : = += -= *=
数字直接量 NumericLiteral
字符串直接量 StringLiteral
JavaScript中的StringLiteral支持单引号和双引号两种写法。
" DoubleStringCharacters "
' SingleStringCharacters '
第一种是单字符转义。 即一个反斜杠\后面跟一个字符这种形式。
有特别意义的字符包括有SingleEscapeCharacter所定义的9种,见下表:
除了这9种字符、数字、x和u以及所有的换行符之外,其它字符经过\转义后都是自身。
正则表达式直接量 RegularExpressionLiteral
正则表达式由Body和Flags两部分组成,例如:
/RegularExpressionBody/g
字符串模板 Template
从语法结构上,Template是个整体,其中的 ${ } 是并列关系。
但是实际上,在JavaScript词法中,包含 ${ } 的 Template,是被拆开分析的,如:
`a${b}c${d}e`
在JavaScript中被认为是:
`a${
b
}c${
d
}e`
它被拆分成5个部分:
`a${ 这个被称为模板头
}c${ 被称为模板中段
}e` 被称为模板尾
b 和 d 都是普通标识符
此文章为7月Day10学习笔记,内容来源于极客时间《重学前端》,日拱一卒,每天进步一点点💪💪
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。