2

0 から 7 までの数字をエスケープして警告すると、奇妙な記号が表示されることがわかりました。

alert( "\0" ); // or \1, \2, \3...\7

奇妙なキャラクター

これは私が警告したときにのみ表示されますが、document.write と console.log には表示されません。7 より大きい数字のエスケープは正常に表示されます。最新バージョンの Chrome を使用しています。なぜ私はこの奇妙なキャラクターを手に入れたのですか?ありがとう。

4

1 に答える 1

3

文字列リテラルが一般的に解析される方法は、セクション 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 進シーケンスとして解釈されます。x07

したがって、すべての文字\0-\7は実際には制御文字です。より高い値は、他の文字を参照します。たとえば\101isAです。

が奇妙な文字を表示し、コンソールに何も表示されない理由alertはわかりません...これはおそらく実装の詳細です。


豆知識: 8 進数のエスケープ シーケンスは、厳密モードでは使用できません。

豆知識 #2: \0実際には 8 進数のエスケープ シーケンスではなく、strict モードでも機能します。独自のプロダクション ルールがあるためです (セクション 7.8.4を参照)。OTHA\00は 8 進数のシーケンスであり、厳密モードではエラーがスローされます。

于 2012-10-09T00:45:26.047 に答える