簡體   English   中英

在ECMA-262嚴格模式下,是否允許在字符串中使用\\\\后跟十進制數字?

[英]Is '\0' followed by a decimal digit in string allowed in ECMA-262 strict mode?

根據ECMA-262規范(第6版),在嚴格模式下,在\\后面的單引號或雙引號字符串中可以使用EscapeSequence或LineTerminatorSequence,並且EscapeSequence必須為以下值之一:CharacterEscapeSequence,0 [lookahead∉DecimalDigit] ,HexEscapeSequence,UnicodeEscapeSequence(請參見11.8.4)。

這是否意味着在'\\ 0'之后有任何DecimalDigit完全不正確?

我知道這樣做是為了避免與LegacyOctalEscapeSequence(來自B.1.2)混淆,但是它只需要在第一個'\\ 0'之后放置八位數字,並且V8引擎似乎以這種方式支持此操作(請參見下文) 。

在檢查完實現之后,事實證明V8引擎允許具有'\\ 0',之后僅是DecimalDigit,而不是OctalDigit。 在這種情況下,它將解析為字符串,該字符串的第一個位置的字符串值為0,然后將下一位的代碼點值作為SourceCharacter。 在'\\ 0'之后給OctalDigit賦值時,它會引發SyntaxError並顯示消息“嚴格模式下不允許八進制轉義序列。”,這有點誤導。 Chakra和SpiderMonkey似乎在'\\ 0'之后的任何DecimalDigit上拋出SyntaxError,但是帶有類似八進制轉義序列的消息,在某些情況下看起來尤為奇怪(在'\\ 0'之后帶有'8'或'9',這不能是嚴格模式之外的八進制轉義序列)。

那么,我的問題是對規范的正確解釋是什么?

“ 0 [lookahead∉DecimalDigit]”對我來說似乎很明確: \\0之后不允許使用十進制數字。

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

有趣的是,test262似乎根本沒有涵蓋這種情況。

有點相關:所有瀏覽器都在嚴格模式下接受"\\8""\\9" ,根據規范,這應引發SyntaxError。 esdiscuss.org上有一個線程,它指示(但至少過去是)Web兼容性需要違反規范:當現有網站依賴於不符合規范的行為時,瀏覽器通常不能僅將其行為更新為遵守規范,因為這樣做會破壞此類網站,並且網站對用戶(以及瀏覽器開發人員)的正確運作比遵守規范更為重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM