弦
概要
意味
文字列は、一重引用符または二重引用符で囲まれ、0 個以上の文字がまとめて配置されたものです。
「ABC」
「ABC」
二重引用符は一重引用符で囲まれた文字列内で使用できます。一重引用符は二重引用符で囲まれた文字列内で使用できます。
'キー = "値"'
「長い旅だ」
上記は両方とも有効な文字列です。
一重引用符で囲まれた文字列内で一重引用符を使用する場合は、内側の一重引用符の前にバックスラッシュを追加してエスケープする必要があります。内部で二重引用符を使用する二重引用符で囲まれた文字列についても同様です。
「彼女は『こんにちは』って言いましたか?」
// 「彼女は『こんにちは』って言いましたか?」
「彼女は「こんにちは」と言いましたか?」
// 「彼女は『こんにちは』って言いましたか?」
HTML 言語の属性値には二重引用符が使用されるため、多くのプロジェクトは、JavaScript 言語の文字列では単一引用符のみを使用することに同意しています。もちろん、二重引用符を使用するだけでもまったく問題ありません。 1 つのスタイルに固執し、ある瞬間には文字列に一重引用符を使用し、次の瞬間には二重引用符を使用しないことが重要です。
デフォルトでは、文字列は 1 行でのみ記述できます。複数行に分かれている場合は、エラーが報告されます。
「あ」
b
ち」
// SyntaxError: 予期しないトークン ILLEGAL
上記のコードは文字列を 3 行に分割しており、JavaScript はエラーを報告します。
長い文字列を複数の行に分割する必要がある場合は、各行の末尾にバックスラッシュを使用できます。
var longString = '長い\
長さ\
長さ\
弦';
長い文字列
// "長い長い長い文字列"
上記のコードは、バックスラッシュを追加すると、最初は 1 行で記述された文字列を複数行で記述できることを示しています。ただし、出力は依然として 1 行であり、その効果は同じ行に書き込んだ場合とまったく同じです。バックスラッシュの後には、他の文字 (スペースなど) ではなく、改行文字を続ける必要があることに注意してください。そうしないと、エラーが報告されます。
接続演算子 (+
) は複数の単一行の文字列を接続し、長い文字列を複数行に分割して書き込むことができ、出力も単一行になります。
var longString = '長い'
+ '長い'
+ '長い'
+ '文字列';
複数行の文字列を出力する場合は、複数行のコメントを使用する回避策があります。
(関数 () { /*
1行目
2行目
3行目
*/}).toString().split('\n').slice(1, -1).join('\n')
// "1行目
// 2行目
// 3行目"
上記の例では、出力文字列は複数行になります。
逃げる
バックスラッシュ () は文字列内で特別な意味を持ち、一部の特殊文字を表すために使用されるため、エスケープ文字とも呼ばれます。
バックスラッシュでエスケープする必要がある特殊文字は主に以下のとおりです。
\0
: null (\u0000
)\b
: 戻るキー (\u0008
)\f
: フォーム フィード文字 (\u000C
)\n
: 改行文字 (\u000A
)\r
: Enterキー(\u000D
)\t
: タブ文字 (\u0009
)\v
: 垂直タブ文字 (\u000B
)\'
: 一重引用符 (\u0027
)\"
: 二重引用符 (\u0022
)\\
: バックスラッシュ (\u005C
)
バックスラッシュが前にある上記の文字には特別な意味があります。
console.log('1\n2')
// 1
// 2
上記のコードでは、「\n」は改行を意味し、出力は 2 行に分割されます。
バックスラッシュには 3 つの特別な使用法があります。
(1)「\HHH」
バックスラッシュの後に続く 3 つの 8 進数 (「000」から「377」) は文字を表します。 HHH
は文字の Unicode コード ポイントに対応します。たとえば、\251
は著作権記号を表します。明らかに、このメソッドは 256 文字しか出力できません。
(2)「\xHH」
「\x」の後には、文字を表す 2 つの 16 進数 (「00」から「FF」) が続きます。 HH
は文字の Unicode コード ポイントに対応します。たとえば、\xA9
は著作権記号を表します。このメソッドは 256 文字しか出力できません。
(3)「\uXXXX」
「\u」の後には、文字を表す 4 つの 16 進数 (「0000」から「FFFF」) が続きます。 「XXXX」は文字の Unicode コード ポイントに対応します。たとえば、「\u00A9」は著作権記号を表します。
以下に、これら 3 つの文字の特殊な書き方の例を示します。
'\251' // "©"
'\xA9' // "©"
'\u00A9' // "©"
'\172' === 'z' // true
'\x7A' === 'z' // true
'\u007A' === 'z' // true
非特殊文字の前にバックスラッシュが使用されている場合、バックスラッシュは省略されます。
'\a'
//「あ」
上記のコードでは、「a」は通常の文字であり、その前のバックスラッシュには特別な意味はありません。バックスラッシュは自動的に省略されます。
文字列の通常の内容にバックスラッシュを含める必要がある場合は、バックスラッシュ自体をエスケープするためにバックスラッシュの前にバックスラッシュを追加する必要があります。
「前 \\ 次」
// "前\次"
文字列と配列
文字列は文字の配列として扱うことができるため、配列の大括弧演算子を使用して、特定の位置 (位置番号は 0 から始まります) の文字を返すことができます。
vars = 'こんにちは';
s[0] // "h"
s[1] // "e"
s[4] // "o"
// 角括弧演算子を文字列に直接使用します
'hello'[1] // "e"
角括弧内の数値が文字列の長さを超える場合、または角括弧内の数値がまったく数値ではない場合は、「未定義」が返されます。
'abc'[3] // 未定義
'abc'[-1] // 未定義
'abc'['x'] // 未定義
ただし、文字列と配列の類似点はそれだけにとどまります。実際、文字列内の個々の文字を変更することはできません。
vars = 'こんにちは';
s[0]を削除します。
s // 「こんにちは」
s[1] = 'a';
s // 「こんにちは」
s[5] = '!';
s // 「こんにちは」
上記のコードは、文字列内の個々の文字を変更、追加、または削除することができず、これらの操作は通知なしで失敗することを示しています。
長さ属性
length
プロパティは文字列の長さを返しますが、変更することはできません。
vars = 'こんにちは';
s.length // 5
s.length = 3;
s.length // 5
s.length = 7;
s.length // 5
上記のコードは、文字列の長さ属性は変更できないが、エラーは報告されないことを示しています。
##文字セット
JavaScript は Unicode 文字セットを使用します。 JavaScript エンジン内では、すべての文字が Unicode で表現されます。
JavaScript は文字を Unicode で保存するだけでなく、Unicode コード ポイントを使用してプログラム内で文字を直接表現することもできます。つまり、文字は \uxxxx
の形式で記述されます。ここで、xxxx
は Unicode コード ポイントを表します。キャラクター。たとえば、「\u00A9」は著作権記号を表します。
var s = '\u00A9';
s // "©"
コードを解析するとき、JavaScript は文字がリテラル形式で表現されているか Unicode 形式で表現されているかを自動的に識別します。ユーザーに出力するとき、すべての文字はリテラル形式に変換されます。
var f\u006F\u006F = 'abc';
foo // "ABC"
上記コードでは、1行目の変数名「foo」がUnicode形式で表現され、2行目はリテラル形式で表現されています。 JavaScript は自動的に認識されます。
また、JavaScript の内部では各文字が 16 ビット (つまり 2 バイト) UTF-16 形式で保存されていることも知っておく必要があります。つまり、JavaScriptの単位文字長は16ビット、つまり2バイトに固定されています。
ただし、UTF-16 には 2 つの長さがあります。「U+0000」と「U+FFFF」の間のコード ポイントを持つ文字の場合、長さは 16 ビット (つまり、2 バイト) です。 と
U+10FFFFは長さ 32 ビット (つまり 4 バイト) で、最初の 2 バイトは
0xD800と
0xDBFFの間にあり、最後の 2 バイトは
0xDC00から
0xDFFFの間にあります。たとえば、コード ポイント
U+1D306に対応する文字は
𝌆 で、UTF-16 では 0xD834 0xDF06
と記述されます。
JavaScript による UTF-16 のサポートは、歴史的な理由により不完全であり、2 バイト文字のみがサポートされており、4 バイト文字はサポートされていません。これは、JavaScript の最初のバージョンがリリースされたとき、Unicode コード ポイントは「U+FFFF」にのみエンコードされていたため、それを表すには 2 バイトで十分だったためです。その後、Unicode にはさらに多くの文字が含まれるようになり、4 バイトのエンコーディングが登場しました。しかし、現時点ではJavaScriptの標準規格が決定されており、文字長が一律2バイトに制限されているため、4バイト文字は認識できません。前のセクションの 4 バイト文字 𝌆
は、ブラウザーでは正しく 1 文字として認識されますが、JavaScript では認識できず、2 文字として認識されます。
'𝌆'.length // 2
上記のコードでは、JavaScript は 𝌆
の長さが 1 ではなく 2 であるとみなします。
要約すると、コード ポイントが U+10000
から U+10FFFF
までの文字については、JavaScript は常に 2 文字とみなされます (length
属性は 2)。したがって、処理するときは、これを考慮する必要があります。つまり、JavaScript によって返される文字列の長さが正しくない可能性があります。
Base64 トランスコーディング
場合によっては、テキストに印刷できない記号が含まれている場合があります。たとえば、ASCII コード 0 ~ 31 の記号を印刷可能な文字に変換することができます。別のシナリオとしては、バイナリ データをテキスト形式で渡す必要がある場合があり、その場合は Base64 エンコードも使用できます。
いわゆる Base64 は、任意の値を 0 ~ 9、A ~ Z、a ~ z、+
、および /
の 64 文字で構成される印刷可能な文字に変換できるエンコード方式です。これを使用する主な目的は暗号化ではなく、特殊文字を回避し、プログラムの処理を簡素化することです。
JavaScript は、2 つの Base64 関連メソッドをネイティブに提供します。
btoa()
: 任意の値を Base64 エンコードに変換しますatob()
: Base64エンコーディングを元の値に変換します
var string = 'Hello World!';
btoa(string) // "SGVsbG8gV29ybGQh"
atob('SGVsbG8gV29ybGQh') // "Hello World!"
これら 2 つの方法は非 ASCII 文字には適しておらず、エラーが報告されることに注意してください。
btoa('Hello') // エラーレポート
非 ASCII 文字を Base64 エンコードに変換するには、中間にトランスコーディング リンクを挿入してから、これら 2 つの方法を使用する必要があります。
関数 b64Encode(str) {
btoa(encodeURIComponent(str)) を返します。
}
関数 b64Decode(str) {
戻り decodeURIComponent(atob(str));
}
b64Encode('Hello') // "JUU0JUJEJUEwJUU1JUE1JUJE"
b64Decode('JUU0JUJEJUEwJUU1JUE1JUJE') // "こんにちは"
参考リンク
- Mathias Bynens、JavaScript の内部文字エンコーディング: UCS-2 または UTF-16?
- Mathias Bynens、JavaScript には Unicode の問題があります
- Mozilla Developer Network、Window.btoa
作者: wangdoc
アドレス: https://wangdoc.com/
ライセンス: クリエイティブ・コモンズ 3.0