0 から 7 までの数字をエスケープして警告すると、奇妙な記号が表示されることがわかりました。
alert( "\0" ); // or \1, \2, \3...\7
これは私が警告したときにのみ表示されますが、document.write と console.log には表示されません。7 より大きい数字のエスケープは正常に表示されます。最新バージョンの Chrome を使用しています。なぜ私はこの奇妙なキャラクターを手に入れたのですか?ありがとう。
0 から 7 までの数字をエスケープして警告すると、奇妙な記号が表示されることがわかりました。
alert( "\0" ); // or \1, \2, \3...\7
これは私が警告したときにのみ表示されますが、document.write と console.log には表示されません。7 より大きい数字のエスケープは正常に表示されます。最新バージョンの Chrome を使用しています。なぜ私はこの奇妙なキャラクターを手に入れたのですか?ありがとう。
文字列リテラルが一般的に解析される方法は、セクション 7.8.4で説明されています。
ただし、表示される動作は、付録 B.1.2で説明されています。このセクションでは、古い ES バージョンの 8 進エスケープ シーケンスについて説明しますが、これはまだサポートされているようです。結果の文字は次のように定義されます。
- OctalEscapeSequence :: OctalDigit [lookahead ∉ DecimalDigit]の CV は、コード単位の値が OctalDigit の MV である文字です。
- OctalEscapeSequence :: ZeroToThree OctalDigit [lookahead ∉ DecimalDigit]の CV は、コード単位の値が ( ZeroToThree の MV の 8 倍) にOctalDigitの MV を加えた文字です。
- OctalEscapeSequence :: FourToSeven OctalDigitの CV は、コード単位の値が (FourToSeven の MV の 8 倍) にOctalDigitの MV を加えた文字です。
- OctalEscapeSequence :: ZeroToThree OctalDigit OctalDigitの CV は、コード単位の値が ( ZeroToThreeの MV の 64 (つまり 82) 倍) + (最初のOctalDigitの MV の 8 倍) + 2 番目のOctalDigitの MV である文字です。 .
\x
( \xx
, ) は、 が 8 進数字の場合、つまり と の間にある場合\xxx
にのみ、8 進シーケンスとして解釈されます。x
0
7
したがって、すべての文字\0
-\7
は実際には制御文字です。より高い値は、他の文字を参照します。たとえば\101
isA
です。
が奇妙な文字を表示し、コンソールに何も表示されない理由alert
はわかりません...これはおそらく実装の詳細です。
豆知識: 8 進数のエスケープ シーケンスは、厳密モードでは使用できません。
豆知識 #2: \0
実際には 8 進数のエスケープ シーケンスではなく、strict モードでも機能します。独自のプロダクション ルールがあるためです (セクション 7.8.4を参照)。OTHA\00
は 8 進数のシーケンスであり、厳密モードではエラーがスローされます。