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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM