ECMAScript6词法
ES6简介
ECMAScript 6.0(简称 ES6)是 JavaScript 语言的下一代标准,它于2015 年 6 月正式发布。ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现。ECMAScript实现还有Jscript和ActionScript。
源文本(Source Text)
ECMAScript代码使用Unicode,8.0.0或更高版本来表示。包含U+0000至U+10FFFF的所有Unicode代码点值。
词法
SourceCharacter::
any Unicode code point
note
在Java程序中,如果Unicode转义序列\u000A发生在单行注释中,则将其解释为行终止符(Unicode代码点U + 000A为LINE FEED(LF)),因此下一个代码点不是注释的一部分
在ECMAScript程序中,注释中发生的Unicode转义序列从不被解释
源代码类型
主要分为以下4中类型:
全局代码(Global code)
全局代码(Global code)是被视为ECMAScript脚本的源文本。特定脚本的全局代码不包括被解析为FunctionDeclaration,FunctionExpression,GeneratorDeclaration,GeneratorExpression,MethodDefinition,ArrowFunction,ClassDeclaration或ClassExpression的一部分的源文本。
Eval代码(Eval code)
Eval代码(Eval code)是提供给内置eval函数的源文本。 更确切地说,如果内置eval函数的参数是一个String,那么它被视为一个ECMAScript脚本。 eval的特定调用的eval代码是该脚本的全局代码部分。
函数代码(Function code)
函数代码(Function code)是解析为ECMAScript函数对象的[[ECMAScriptCode]]和[[FormalParameters]]内部插槽的值的源文本。 特定ECMAScript函数的函数代码不包括被解析为嵌套的FunctionDeclaration,FunctionExpression,GeneratorDeclaration,GeneratorExpression,MethodDefinition,ArrowFunction,ClassDeclaration或ClassExpression的函数代码的任何源文本。
模块代码(Module code)
模块代码(Module code)是作为ModuleBody提供的代码的源文本。 它是在模块初始化时直接执行的代码。 特定模块的模块代码不包括被解析为嵌套的FunctionDeclaration,FunctionExpression,GeneratorDeclaration,GeneratorExpression,MethodDefinition,ArrowFunction,ClassDeclaration或ClassExpression的一部分的任何源文本。
严格模式代码
全局代码,eval代码等包含 使用严格指令(Use Strict Directive)是严格模式代码
模块代码总是严格的模式代码。
ClassDeclaration或ClassExpression的所有部分都是严格的模式代码。
输入元素
ECMAScript脚本或模块的源文本首先被转换为一系列输入元素,
源文本从左到右扫描,重复地将最长可能的代码点序列作为下一个输入元素。

词法
词法语法的多个目标符号
InputElementDiv::
WhiteSpace
LineTerminator
Comment
CommonToken
DivPunctuator
RightBracePunctuator
InputElementRegExp::
WhiteSpace
LineTerminator
Comment
CommonToken
RightBracePunctuator
RegularExpressionLiteral
InputElementRegExpOrTemplateTail::
WhiteSpace
LineTerminator
Comment
CommonToken
RegularExpressionLiteral
TemplateSubstitutionTail
InputElementTemplateTail::
WhiteSpace
LineTerminator
Comment
CommonToken
DivPunctuator
TemplateSubstitutionTail
格式控制字符
Unicode格式控制字符(即,Unicode字符数据库中的类别“Cf”中的字符,),在没有更高级别的协议(如标记语言)的情况下,控制一系列文本的格式的控制代码。
允许源文本中的格式控制字符有助于编辑和显示。 所有格式控制字符可以在注释中使用,也可以在字符串文字,模板文字和正则表达式文字中使用。
U+200C(ZERO WIDTH NON-JOINER)和U+200D(ZERO WIDTH JOINER)是用于在以特定语言形成单词或短语时进行必要区分的格式控制字符。 在ECMAScript源文本中,这些代码点也可以在第一个字符之后的IdentifierName中使用。
U+FEFF(ZERO WIDTH NO-BREAK SPACE)是一种主要用于文本开头的格式控制字符,用于将其标记为Unicode,并允许检测文本的编码和字节顺序。 为此目的的字符有时也可能出现在文本开头之后,例如连接文件的结果。 在ECMAScript源文本中,代码点被视为空白字符

White Space
空白代码点用于提高源文本的可读性,并将词条(token)(不可分割的词汇单位)彼此分开

Line Terminators
像空白代码点一样,行终止符代码点用于提高源文本的可读性,并将token(不可分割的词汇单位)彼此分开。
行终止符可以在MultiLineComment中发生,但不能在SingleLineComment中发生。
行终止符包含在正则表达式中由\s类匹配的一组空白代码点中。/\s/.test("\u000a")返回true。

Comments
注释可以是单行还是多行。 多行注释不能嵌套。
Tokens
CommonToken::
IdentifierName
Punctuator
NumericLiteral
StringLiteral
Template
IdentifierName
IdentifierName和 ReservedWord是根据Unicode标准附件31中标识符和模式语法给出的默认标识符语法进行解释的token,并进行了一些小的修改。ReservedWord是IdentifierName的枚举子集。 语法语法将Identifier定义为不是ReservedWord的IdentifierName 。
该标准规定了特定的代码点添加:标识符名称中的任何地方允许使用U+ 0024(DOLLAR SIGN)和U+005F(LOW LINE),代码点U+200C(ZERO WIDTH NON-JOINER)和U+200D(ZERO WIDTH JOINER)允许在IdentifierName的第一个代码点之后的任何地方。
在IdentifierName中允许使用Unicode转义序列,它们向IdentifierName贡献一个Unicode代码点。 代码点由Unicode转义序列的16进制表示(见11.8.4)。 在Unicode转义序列之前的\和u和{}代码单元,如果它们出现,不贡献代码点到IdentifierName。 Unicode转义序列不能用于将代码点放入否则为非法的IdentifierName。 换句话说,如果一个\UnicodeEscapeSequence序列被SourceCharacter替换,那么该结果仍然是一个有效的IdentifierName,它具有与原始IdentifierName完全相同的SourceCharacter元素序列。 本规范中IdentifierName的所有解释均基于其实际代码点,而不管转义序列是否用于提供任何特定的代码点。
IdentifierName::
IdentifierStart
IdentifierNameIdentifierPart
IdentifierStart::
UnicodeIDStart
$
_
\UnicodeEscapeSequence
IdentifierPart::
UnicodeIDContinue
$
_
\UnicodeEscapeSequence
<ZWNJ>
<ZWJ>
UnicodeIDStart::
any Unicode code point with the Unicode property “ID_Start”
UnicodeIDContinue::
any Unicode code point with the Unicode property “ID_Continue”
Reserved Words
保留字(reserved word)是不能用作标识符(Identifier)的IdentifierName。
ReservedWord定义被指定为特定SourceCharacter元素的文字序列。 ReservedWord中的代码点不能由\ UnicodeEscapeSequence表示。
ReservedWord::
Keyword
FutureReservedWord
NullLiteral
BooleanLiteral
Keywords&Future Reserved Words

在严格模式代码中,implements package,Protected,interface,private,public,let和static通过静态语义限制
Literals

Numeric Literals

0b101,0o72,0xabc分别是2进制,8进制,16进制数字字面量
String Literals
字符串字面值为零或更多的Unicode代码点,以单引号或双引号括起来
Unicode代码点也可以由转义序列表示
U+005C(REVERSE SOLIDUS),U+000D(CARRIAGE RETURN),U+ 2028(LINE SEPARATOR),U+2029(PARAGRAPH SEPARATOR)和U+000A(LINE FEED)代码点除外,所有代码点可以以字符串文字形式出现
UTF16Encoding ( cp )算法:
Assert: 0 ≤ cp ≤ 0x10FFFF.
If cp ≤ 65535, return cp.
Let cu1 be floor((cp - 65536) / 1024) + 0xD800.
Let cu2 be ((cp - 65536) modulo 1024) + 0xDC00.
Return the code unit sequence consisting of cu1 followed by cu2.
属于基本多语言平面的代码点被编码为字符串的单个代码单元元素。 所有其他代码点被编码为字符串的两个代码单元元素。例如:
‘\u{20BB7}’
‘\u0005’
EscapeCharacter

同样一个字符“|”的不同转义字符表示:
十进制表示:'\5'
16进制表示:'\x05'
unicode表示:'\u0005'
unicode表示:'\u{5}'
字符串单字符转义序列:

Regular Expression Literals
正则表达式文字是每次执行文字时转换为RegExp对象(参见21.2)的输入元素。 程序中的两个正则表达式文字作为正则表达式对象执行时,即使两个文字的内容相同,也不会彼此比较为===。
/\d/ === /\d/
返回false
正则表达式字面量词法:
RegularExpressionLiteral::
/RegularExpressionBody/RegularExpressionFlags
正则表达式不能以* 或 \ 或 / 或 [开始,事实证明以下正则是会报语法错误的
/[/
/*/
对于[符号,是元字符,单个[需要转义吧:
/\[/
除了开始位置, \ 或 / 或 [ 也是不允许直接出现,如需使用需转义。
如果要匹配空字符串,可以使用如下正则:
/(?:)/.test('')
Template Literal Lexical Components
模板字面量词法组件词法:

学习词法规范能让我们更好地了解js基础知识,如果你想了解全部的ECMAScript6语言规范,可以访问github:https://github.com/zhoushengmufc/es6,或者访问在线文档:http://zhoushengfe.com/es6/es6-ch.html
ECMAScript6词法的更多相关文章
- [译]Understanding ECMAScript6 函数
函数 函数是任何编程语言的重要组成部分,而自从JavaScript被引入以来,JavaScript的函数就未有太多改变.遗留下来的积压问题及微妙行为使我们很容易犯错误,或者需要更多的代码来实现一个非常 ...
- 使用Visual Studio SDK制作GLSL词法着色插件
使用Visual Studio SDK制作GLSL词法着色插件 我们在Visual Studio上开发OpenGL ES项目时,避免不了写Shader.这时在vs里直接编辑shader就会显得很方便. ...
- jQuery 2.0.3 源码分析Sizzle引擎 - 词法解析
声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 浏览器从下载文档到显示页面的过程是个复杂的过程,这里包含了重绘和重排.各家浏览器引擎的工作原理略有差别,但也有一定规则. 简 ...
- 浅尝ECMAScript6
浅尝ECMAScript6 简介 ECMAScript6 是最新的ECMAScript标准,于2015年6月正式推出(所以也称为ECMAScript 2015),相比于2009年推出的es5, es6 ...
- jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——词法解析
jQuery源码9600多行,而Sizzle引擎就独占近2000行,占了1/5.Sizzle引擎.jQuery事件机制.ajax是整个jQuery的核心,也是jQuery技术精华的体现.里面的有些策略 ...
- 你不知道的Javascript(上卷)读书笔记之二 ---- 词法作用域
在前一篇文章中,我们把作用域定义为"管理.维护变量的一套规则",接下来是时候来深入讨论一下Js的作用域问题了,首先我们要知道作用域一般有两种主要的工作类型,一种是词法作用域,一种是 ...
- Coursera系列-R Programming第三周-词法作用域
完成R Programming第三周 这周作业有点绕,更多地是通过一个缓存逆矩阵的案例,向我们示范[词法作用域 Lexical Scopping]的功效.但是作业里给出的函数有点绕口,花费了我们蛮多心 ...
- JavaScript闭包之“词法作用域”
大家应该写过下面类似的代码吧,其实这里我想要表达的是有时候一个方法定义的地方和使用的地方会相隔十万八千里,那方法执行时,它能访问哪些变量,不能访问哪些变量,这个怎么判断呢?这个就是我们这次需要分析的问 ...
- ECMAScript6 中 类的封装与继承
ECMASCRIPT6中实现了class关键字,这样使我们更容易也更形象的进行类的操作 <script type="text/javascript"> class OF ...
随机推荐
- 【特效】页面滚动到相应位置运行css3动画
请到我的个人博客网站上浏览此文章,欢迎评论和建议. 文章链接:http://www.xiaoxianworld.com/archives/87 现在css3动画很常见了,实际项目中经常应用,特别是那种 ...
- Java 线程并发
http://www.yesky.com/9/1899009.shtml http://zhidao.baidu.com/link?url=-xZ9JLo5x4bvCSVyXb2XhO6TODnBcU ...
- MVC.NET 发布后,部署到iis ,网站中的Bootstrap的字体图标不能正常显示
时隔多日没有在博客中记录自己遇到的问题及解决方案了 ,今天给大家分享一个可能会遇到的一个鸡肋bug ! 如果你的项目是MVC并且在项目中引用了 Boostrap 框架,你在编辑发布后部署到iis的时候 ...
- iOS 记录近期遇到的几个bug
1. actionSheet与pickerView 不兼容 发生环境:ios 9以上,其他无测试. actionSheet与pickerView在一起使用时,当actionSheet弹出后,紧接着再弹 ...
- win10 uwp 获得缩略图
有时候需要获得文件或视频的缩略图. 本文提供两个方法,用于获得文件的缩略图和截取视频指定时间的显示图片. 文件缩略图 如果有一个文件需要获得缩略图,可以使用 GetThumbnailAsync 或 G ...
- 张高兴的 UWP 开发笔记:应用内启动应用 (UWP Launch UWP)
需求:在 A 应用内启动 B 应用,如果 B 应用未安装则跳转应用商店搜索. 启动方式使用 Uri 启动,本文使用尽可能简单,并且能拿来直接用的代码.不涉及启动后的应用数据交互,如需深入了解,请戳 M ...
- UVa11882,Biggest Number
搜索+剪枝 如此水的一个题,居然搞了一上午 出错在bfs与dfs时共用了一个vis数组,导致bfs完后返回dfs应该能访问到的点访问不到 自己想怎么剪枝,想了几个剪枝方法,又证明,又推翻,再想,再证明 ...
- 解读python中SocketServer源码
在看SocketServer源码之前,先看一个例子: class Base(object): def __init__(self, name): self.name = name self.Testf ...
- Django之环境搭建以及初始配置
Django采用MVC架构,百度百科介绍如下: 全名Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业 ...
- LeetCode Questions List (LeetCode 问题列表)- Java Solutions
因为在开始写这个博客之前,已经刷了100题了,所以现在还是有很多题目没有加进来,为了方便查找哪些没加进来,先列一个表可以比较清楚的查看,也方便给大家查找.如果有哪些题目的链接有错误,请大家留言和谅解, ...