附錄B:兼容性

2018-06-16 15:50 更新

附加語法

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

數(shù)字直接量

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

 語法

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 中的語法、語義可以做如下擴(kuò)展,但在嚴(yán)格模式代碼里不允許做這樣的擴(kuò)展。

 語法

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 是個(gè)字符,它的 unicode 代碼單元值是 OctalDigit 的 MV 。
  • OctalEscapeSequence :: ZeroToThree OctalDigit [lookahead ? DecimalDigit] 的 CV 是個(gè)字符,它的 unicode 代碼單元值是 ZeroToThree 的 MV 乘以 8 再加上 OctalDigit 的 MV。
  • OctalEscapeSequence :: FourToSeven OctalDigit 的 CV 是個(gè)字符,它的 unicode 代碼單元值是 FourToSeven 的 MV 乘以 8 再加上 OctalDigit 的 MV。
  • OctalEscapeSequence :: ZeroToThree OctalDigit OctalDigit 的 CV 是個(gè)字符,它的 unicode 代碼單元值是 (ZeroToThree 的 MV 乘以 64 (82) ) 加上 ( 第一個(gè)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的實(shí)現(xiàn)可能會(huì)包含一些標(biāo)準(zhǔn)原生對(duì)象上的附加屬性。這一非標(biāo)準(zhǔn)附錄提示了一些這樣的屬性常見的語義,但是這并不意味著他們和其語義成為標(biāo)準(zhǔn)的一部分。

escape(string)

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

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

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

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

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

unescape(string)

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

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

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

String.prototype.substr(start, length)

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

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

 substr 方法的 length 屬性是2。

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

Date.prototype.getYear( )

 對(duì)于近乎所有用途,getFullYear 方法都是首選的,因?yàn)樗苊饬恕?000年問題”。

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

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

Date.prototype.setYear(year)

 對(duì)于近乎所有用途, setFullYear 方法都是首選的,因?yàn)樗苊饬恕?000年問題”。

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

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

Date.prototype.toGMTString( )

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

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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)