ECMAScript6詞法

ES6簡介

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

html

源文本(Source Text)

    ECMAScript代碼使用Unicode,8.0.0或更高版原本表示。包含U+0000至U+10FFFF的全部Unicode代碼點值。git

詞法

    

SourceCharacter::
      any Unicode code point

 

note

    在Java程序中,若是Unicode轉義序列\u000A發生在單行註釋中,則將其解釋爲行終止符(Unicode代碼點U + 000A爲LINE FEED(LF)),所以下一個代碼點不是註釋的一部分es6

在ECMAScript程序中,註釋中發生的Unicode轉義序列從不被解釋github

 

源代碼類型

    主要分爲如下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

相關文章
相關標籤/搜索