2017-06-17 36 views
3

根據ECMA-262規範(第6版)以嚴格模式在'\'之後的單引號或雙引號字符串中可能有EscapeSequence或LineTerminatorSequence,並且EscapeSequence必須是以下之一:CharacterEscapeSequence,0 [lookahead∉ DecimalDigit],HexEscapeSequence,UnicodeEscapeSequence(見11.8.4)。在ECMA-262嚴格模式下允許的字符串中是否有' 0'後面跟着一個十進制數字?

這是否意味着在'\ 0'之後有任何DecimalDigit是完全不正確的?我知道這樣做是爲了避免與LegacyOctalEscapeSequence(來自B.1.2)混淆,但它只需要在第一個'\ 0'之後放置八進制數字,並且V8引擎似乎以這種方式支持這一點(見下文)。

經過檢查與實施後,事實證明,V8引擎允許「\ 0」只有十進制數字不是一個八進制數字。在這種情況下,它會將它解析爲字符串值爲0的字符串,然後將下一個數字的代碼點值作爲SourceCharacter。當它在'\ 0'後面被賦予一個OctalDigit時,它會拋出一個帶有消息「嚴格模式下不允許使用八進制轉義序列」的SyntaxError,這有點令人誤解。 Chakra和SpiderMonkey似乎在'\ 0'之後的任何DecimalDigit上拋出SyntaxError,但是使用類似的八進制轉義序列的消息,這在某些情況下看起來特別奇怪(在'\ 0'之後'8'或'9' ,它不能是嚴格模式之外的八進制轉義序列)。

所以,我的問題是什麼是規範的正確解釋?

+0

這與特定的JavaScript引擎有什麼關係?刪除標籤。 – xaxxon

回答

2

「0 [lookahead∉DecimalDigit]」對我來說聽起來毫不含糊:在\0之後不允許有十進制數字。

這意味着V8在嚴格模式下允許"\08""\09"這個事實是一個錯誤。你能否在https://bugs.chromium.org/p/v8/提交錯誤?

有趣的是,test262似乎並沒有在所有覆蓋這種情況下...

有點關係:所有的瀏覽器接受"\8""\9"嚴格模式,依據規範應該拋出一個SyntaxError。有一個thread on esdiscuss.org表明此規範違反是(或至少以前曾被認爲)是網絡兼容性所必需的:雖然現有網站依賴於不符合規範的行爲,但瀏覽器通常不能只更新其行爲以符合規範,因爲這樣做會破壞這樣的網站,並且讓網站正常工作對用戶(以及瀏覽器開發人員)來說更重要,而不是符合規範。

相關問題