ECMAScript 6.0(簡稱 ES6)是 JavaScript 語言的下一代標準,它於2015 年 6 月正式發佈。ECMAScript 和 JavaScript 的關係是,前者是後者的規格,後者是前者的一種實現。ECMAScript實現還有Jscript和ActionScript。 ...
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