重学前端
程劭非(winter)
前手机淘宝前端负责人
105348 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
开篇词+学习路线+架构图 (3讲)
重学前端
15
15
1.0x
00:00/00:00
登录|注册

JavaScript词法:为什么12.toString会报错?

字符串模板
正则表达式直接量
字符串直接量
数字直接量
符号
关键字
多行注释
单行注释
<PS>
<LS>
<CR>
<LF>
<ZWNBSP>
<NBSP>
<SP>
<FF>
<VT>
<HT>
Template
RegularExpressionLiteral
StringLiteral
NumericLiteral
Punctuator
IdentifierName
Comment
LineTerminator
Whitespace
字符串模板设计
除法和正则表达式冲突问题
Template
StringLiteral
NumericLiteral
Punctuator
IdentifierName
Token
Comment
LineTerminator
WhiteSpace
语法
词法
字符串模板
正则表达式直接量
字符串直接量
数字直接量
符号
标识符名称
注释
换行符
空白符号
特别设计
JavaScript的词法定义
文法
JavaScript词法

该思维导图由 AI 生成,仅供参考

你好,我是 winter。
在前面的文章中,我们已经从运行时的角度了解过 JavaScript 的知识内容,在接下来的几节课,我们来了解一下 JavaScript 的文法部分。
文法是编译原理中对语言的写法的一种规定,一般来说,文法分成词法和语法两种。
词法规定了语言的最小语义单元:token,可以翻译成“标记”或者“词”,在我的专栏文章中,我统一把 token 翻译成词。
从字符到词的整个过程是没有结构的,只要符合词的规则,就构成词,一般来说,词法设计不会包含冲突。词法分析技术上可以使用状态机或者正则表达式来进行,我们的课程主要是学习词法,关于它们实现的细节就不多谈了。

概述

我们先来看一看 JavaScript 的词法定义。JavaScript 源代码中的输入可以这样分类:
WhiteSpace 空白字符
LineTerminator 换行符
Comment 注释
Token 词
IdentifierName 标识符名称,典型案例是我们使用的变量名,注意这里关键字也包含在内了。
Punctuator 符号,我们使用的运算符和大括号等符号。
NumericLiteral 数字直接量,就是我们写的数字。
StringLiteral 字符串直接量,就是我们用单引号或者双引号引起来的直接量。
Template 字符串模板,用反引号` 括起来的直接量。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

JavaScript词法规定了语言的最小语义单元,包括空白字符、换行符、注释、词、标识符名称、符号、数字直接量、字符串直接量和字符串模板。本文详细介绍了JavaScript中的数字直接量、字符串直接量、正则表达式直接量和字符串模板,以及它们的特殊处理方式。其中,数字直接量支持多种写法,包括科学计数法和特定进制的整数表示;字符串直接量支持单引号和双引号两种写法,以及多种转义形式;正则表达式直接量由Body和Flags两部分组成,具有自己的语法规则;字符串模板在词法分析过程中被拆分成模板头、模板中段和模板尾,还支持添加处理函数的写法。总的来说,JavaScript的词法分析过程相对复杂,需要特别处理除了token之外的输入,同时换行符和注释还会影响语法分析过程。本文内容涵盖了JavaScript词法的基本概念和特殊处理方式,对于想要深入了解JavaScript词法的读者来说,是一份很好的参考资料。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《重学前端》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(33)

  • 最新
  • 精选
  • Nandy
    十进制的number的小数点前后的内容可以省略,但是不能同时省略 .01 = 0.01 10. = 10 12.toString() 12.被当做了一个整体,所以会报错, 加入空格 12 .toString() 这样.就成为了一个单独的token 嘻嘻~请winter老师表扬我学的认真(#^.^#)

    作者回复: 对 表扬。

    2019-07-25
    4
    11
  • lsy
    '敏\u200d感词'.length === 4 // true

    作者回复: 别干坏事啊

    2019-07-10
    2
    11
  • 大海
    为什么parseInt(12).toString()就不会报错呢,parseInt(12)返回的不也是一个数值吗

    作者回复: 感觉白讲了......

    2019-06-19
    10
    1
  • 🐻🔫🐸
    为啥不支持直接回复呢? 这里讨论一下@Snow同学的问题 别忘了JS是允许直接写小数的,也就说12.toString() 他无法分辨你是想要创建一个小数位为toString()的数 还是创建一个12 然后调用toString()这种情况。也就说 JS里面的. 是拥有两种含义的 一种是小数点 一种是方法调用。 你可以试试12..toString() 这样就可以消除这种歧义
    2019-03-24
    1
    54
  • 曾侃
    之前没有接触过零宽字符,学完这节课后网上搜了下零宽字符的应用,看到了这篇文章《[翻译]小心你复制的内容:使用零宽字符将用户名不可见的插入文本中》,受益匪浅。自己用这个思路实现了一样的给字符串添加水印的功能。 代码地址:https://github.com/zengkan0703/text-watermark,有不对的地方请同学们指正。
    2019-04-10
    2
    43
  • 田野的嘴好冰
    零宽空格 var a = '\uFEFF',b = 'b', c = 'c', d = (b+a+c); console.log(d); //bc console.log(d.length); //3 console.log(d.indexOf(a)); //1
    2019-03-26
    2
    42
  • 是零壹呀
    12.toString() 会被解析成 12.(数字字面量) 和 toString()。 所以正常的写法是12..toString()才是正常的
    2019-04-24
    20
  • 王益
    (12).toString()也可以
    2020-03-31
    1
    15
  • Yully
    原来零宽空格和零宽连接符、零宽非连接符还有妙用, 隐形水印、加密信息分享和逃脱关键词匹配。
    2020-05-06
    12
  • CaveShao
    js 中 . 有两种含义,一种是代表一个小数,一种是调用方法。12.toString() 中的 12. 会被浏览器解析为一个省略了小数后面部分的数字。一个数字后面直接写一个方法,就像 333toString 一样,肯定会报错。 Invalid or unexpected token
    2019-05-20
    5
收起评论
显示
设置
留言
33
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部