附錄B:兼容性

2018-06-16 15:50 更新

附加語法

 CMAScript 的過去版本中還包含了說明八進制直接量和八進制轉義序列的額外語法、語義。在此版本中已將這些附加語法、語義移除。這個非規(guī)范性的附錄給出與八進制直接量和八進制轉義序列一致的語法、語義,以兼容某些較老的 ECMAScript 程序。

數(shù)字直接量

 7.8.3 中的語法、語義可以做如下擴展,但在嚴格模式代碼里不允許做這樣的擴展。

 語法

NumericLiteral :: DecimalLiteral HexIntegerLiteral OctalIntegerLiteral OctalIntegerLiteral :: 0 OctalDigit OctalIntegerLiteral OctalDigit OctalDigit :: 以下之一 0 1 2 3 4 5 6 7

 語義

  • NumericLiteral :: OctalIntegerLiteral 的 MV 是 OctalIntegerLiteral 的 MV。
  • OctalDigit :: 0 的 MV 是 0。
  • OctalDigit :: 1 的 MV 是 1。
  • OctalDigit :: 2 的 MV 是 2。
  • OctalDigit :: 3 的 MV 是 3。
  • OctalDigit :: 4 的 MV 是 4。
  • OctalDigit :: 5 的 MV 是 5。
  • OctalDigit :: 6 的 MV 是 6。
  • OctalDigit :: 7 的 MV 是 7。
  • OctalIntegerLiteral :: 0 OctalDigit 的 MV 是 OctalDigit 的 MV。
  • OctalIntegerLiteral :: OctalIntegerLiteral OctalDigit 的 MV 是 OctalIntegerLiteral 的 MV 乘以 8 再加上 OctalDigit 的 MV。

字符串直接量

 7.8.4 中的語法、語義可以做如下擴展,但在嚴格模式代碼里不允許做這樣的擴展。

 語法

EscapeSequence :: CharacterEscapeSequence OctalEscapeSequence HexEscapeSequence UnicodeEscapeSequence OctalEscapeSequence :: OctalDigit [lookahead ? DecimalDigit] ZeroToThree OctalDigit [lookahead ?DecimalDigit] FourToSeven OctalDigit ZeroToThree OctalDigit OctalDigit ZeroToThree :: 以下之一 0 1 2 3 FourToSeven :: 以下之一 4 5 6 7

 語義

  • EscapeSequence :: OctalEscapeSequence 的 CV 是 OctalEscapeSequence 的 CV。
  • OctalEscapeSequence :: OctalDigit [lookahead ? DecimalDigit] 的 CV 是個字符,它的 unicode 代碼單元值是 OctalDigit 的 MV 。
  • OctalEscapeSequence :: ZeroToThree OctalDigit [lookahead ? DecimalDigit] 的 CV 是個字符,它的 unicode 代碼單元值是 ZeroToThree 的 MV 乘以 8 再加上 OctalDigit 的 MV。
  • OctalEscapeSequence :: FourToSeven OctalDigit 的 CV 是個字符,它的 unicode 代碼單元值是 FourToSeven 的 MV 乘以 8 再加上 OctalDigit 的 MV。
  • OctalEscapeSequence :: ZeroToThree OctalDigit OctalDigit 的 CV 是個字符,它的 unicode 代碼單元值是 (ZeroToThree 的 MV 乘以 64 (82) ) 加上 ( 第一個OctalDigit 的 MV 乘以 8 ) 加上 OctalDigit 的 MV。
  • ZeroToThree :: 0 的 MV 是 0.
  • ZeroToThree :: 1 的 MV 是 1。
  • ZeroToThree :: 2 的 MV 是 2。
  • ZeroToThree :: 3 的 MV 是 3。
  • FourToSeven :: 4 的 MV 是 4。
  • FourToSeven :: 5 的 MV 是 5。
  • FourToSeven :: 6 的 MV 是 6。
  • FourToSeven :: 7 的 MV 是 7。

附加屬性

 一些ECMAScript的實現(xiàn)可能會包含一些標準原生對象上的附加屬性。這一非標準附錄提示了一些這樣的屬性常見的語義,但是這并不意味著他們和其語義成為標準的一部分。

escape(string)

 escape函數(shù)是全局對象的一個屬性。它通過將一些字符替換成十六進制轉義序列,計算出一個新字符串值。

 對于代碼單元小于等于0xFF的被替換字符,使用 %xx 格式的兩位數(shù)轉義序列。對于代碼單元大于0xFF的被替換字符,使用 %uxxxx 格式的四位數(shù)轉義序列。

 用一個參數(shù) string 調用 escape 函數(shù),采用以下步驟:

  1. 調用 ToString(string)。
  2. 計算 Result(1) 的字符數(shù)。
  3. 令 R 為空字符串。
  4. 令 k 為 0。
  5. 如果 k 等于 Result(2), 返回 R。
  6. 獲得 Result(1) 中 k 位置的字符(表示為16位無符號整數(shù))。
  7. 如果 Result(6) 是69個非空字符 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@*_+-./" 之一,則轉到步驟13。
  8. 如果 Result(6) 小于256,則轉到步驟11。
  9. 令 S 為包含六個字符 "%u wxyz" 的字符串,其中 wxyz 是用四個十六進制數(shù)字編碼的 Result(6) 值。
  10. 轉到步驟14。
  11. 令 S 為包含三個字符 "% xy" 的字符串,其中 xy 是用兩個十六進制數(shù)字編碼的 Result(6) 值。
  12. 轉到步驟14。
  13. 令 S 為包含單個字符 Result(6) 的字符串。
  14. 令 R 為將之前的 R 和 S 值連起來組成的新字符串。
  15. k 遞增1。
  16. 轉到步驟5。

 這里的編碼方式有部分是基于 RFC 1738 描述的編碼方式, 但本標準規(guī)定的完整編碼方式只有上面描述的這些,不考慮 RFC 1738 中的內(nèi)容。 此編碼方式并沒有反映出從 RFC 1738 到 RFC 3986 的變化。

unescape(string)

 unescape 函數(shù)是全局對象的一個屬性。它通過將每個可能是 escape 函數(shù)導入的轉義序列,分別替換成代表這些轉義序列的字符, 計算出一個新字符串值。

 用一個參數(shù) string 調用 unescape 函數(shù),采用以下步驟:

  1. 調用 ToString(string)。
  2. 計算 Result(1) 的字符數(shù)。
  3. 令 R 為空字符串。
  4. 令 k 為 0。
  5. 如果 k 等于 Result(2),返回 R。
  6. 令 c 為 Result(1) 中 k 位置的字符。
  7. 如果 c 不是 % ,轉到步驟18。
  8. 如果 k 大于 Result(2)?6,轉到步驟14。
  9. 如果 Result(1) 中 k+1 位置的字符不是 u,轉到步驟14。
  10. 如果 Result(1) 中分別在 k+2,k+3,k+4,k+5 位置的四個字符不全是十六進制數(shù)字,轉到步驟14。
  11. 令 c 為一個字符,它的代碼單元值是 Result(1) 中 k+2,k+3,k+4,k+5 位置的四個十六進制數(shù)字代表的整數(shù)。
  12. k 遞增 5。
  13. 轉到步驟18。
  14. 如果 k 大于 Result(2)?3,轉到步驟18。
  15. 如果 Result(1) 中分別在 k+1,k+2 位置的兩個字符不都是十六進制數(shù)字,轉到步驟18。
  16. 令 c 為一個字符,它的代碼單元值是兩個零加上 Result(1) 中 k+1,k+2 位置的兩個十六進制數(shù)字代表的整數(shù)。
  17. k 遞增 2。
  18. 令 R 為將之前的 R 和 c 值連起來組成的新字符串。
  19. k 遞增 1。
  20. 轉到步驟5。

String.prototype.substr(start, length)

 substr 方法有兩個參數(shù) start 和 length,將this對象轉換為一個字符串,并返回這個字符串中從 start 位置一直到 length 位置(或如果 length 是 undefined,就一直到字符串結束位置)的字符組成的子串。如果 start 是負數(shù),那么它就被當作是 (sourceLength+start),這里的 sourceLength 是字符串的長度。返回結果是一個字符串值,不是 String 對象。采用以下步驟:

  1. 將 this 值作為參數(shù)調用ToString。
  2. 調用 ToInteger(start)。
  3. 如果 length 是 undefined,就用 +∞;否則調用 ToInteger(length)。
  4. 計算 Result(1) 的字符數(shù)。
  5. 如果 Result(2) 是正數(shù)或零,就用 Result(2);否則使用 max(Result(4)+Result(2),0)。
  6. 計算 min(max(Result(3),0), Result(4)–Result(5))。
  7. 如果 Result(6) ≤ 0, 返回空字符串 "" 。
  8. 返回一個由 Result(1) 中的 Result(5) 位置的字符開始的連續(xù)的 Result(6) 個字符組成的字符串。

 substr 方法的 length 屬性是2。

 substr 函數(shù)被刻意設計成通用的;它并不要求其 this 值為字符串對象。因此它可以作為方法轉移到其他種類的對象中。

Date.prototype.getYear( )

 對于近乎所有用途,getFullYear 方法都是首選的,因為它避免了“2000年問題”。

 無參數(shù)方式調用 getYear 方法,采用以下步驟:

  1. 令 t 為 this時間值。
  2. 如果 t 是 NaN, 返回 NaN。
  3. 返回 YearFromTime(LocalTime(t)) ? 1900。

Date.prototype.setYear(year)

 對于近乎所有用途, setFullYear 方法都是首選的,因為它避免了“2000年問題”。

 用一個參數(shù) year 調用 setYear 方法,采用以下步驟:

  1. 令 t 為 LocalTime(this時間值) 的結果;但如果 this 時間值是 NaN,那么令 t 為 +0。
  2. 調用 ToNumber(year)。
  3. 如果 Result(2) 是 NaN,將 this 值的 [[PrimitiveValue]] 內(nèi)部屬性設為 NaN,并返回 NaN。
  4. 如果 Result(2) 不是 NaN 并且 0 ≤ ToInteger(Result(2)) ≤ 99 ,則 Result(4) 是 ToInteger(Result(2)) + 1900。否則,Result(4) 是 Result(2)。
  5. 計算 MakeDay(Result(4), MonthFromTime(t), DateFromTime(t))。
  6. 計算 UTC(MakeDate(Result(5), TimeWithinDay(t)))。
  7. 將 this 值的 [[PrimitiveValue]] 內(nèi)部屬性設為 TimeClip(Result(6))。
  8. 返回 this 值的 [[PrimitiveValue]] 內(nèi)部屬性值。

Date.prototype.toGMTString( )

 toUTCString 屬性是首選的,toGMTString 屬性是為了兼容較老的代碼才提供的。建議在新的 ECMAScript 代碼中使用 toUTCString 屬性。

 Date.prototype.toGMTString 的初始值是與 Date.prototype.toUTCString 的初始值相同的函數(shù)對象。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號