意味
文字列は、ゼロ以上の文字が一緒に配置されており、単一の引用符または二重引用符に配置されています。
「ABC」「ABC」二重引用符は、単一の引用文字列内で使用できます。二重引用符文字列内では、単一の引用符を使用できます。
'key = "value"' "それは長い旅です」
どちらも合法的な文字列です。
単一の引用文字列内で単一の引用符(または二重引用文字列内の二重引用符)を使用する場合は、エスケープするには内部の単一の引用(または二重引用符)にプレフィックスする必要があります。
「彼女は言いましたか/'hello/'? '//「彼女は「こんにちは」と言いましたか?」
HTML言語の属性値は二重引用符を使用しているため、多くのプロジェクトはJavaScript言語文字列が単一の引用のみを使用していることに同意し、このチュートリアルはこの規則に従います。もちろん、二重引用符のみを使用することも最適です。 1つのスタイルに固執し、2つのスタイルを混ぜないことが重要です。
デフォルトでは、文字列は1行でのみ書き込むことができ、複数の行に分割されている場合、エラーを報告します。
'ABC' // Syntaxerror:予期しないトークンが違法
上記のコードは文字列を3行に分割し、JavaScriptはエラーを報告します。
長い文字列を複数の線に分割する必要がある場合、各行の最後にバックスラッシュを使用できます。
var longstring = "long /long /long /string"; longstring // "long long string"
上記のコードは、バックスラッシュを追加した後、元々1つの行に書かれた文字列を複数の書き込み行に分割できることを示しています。ただし、出力する場合、効果は依然として単一の行であり、効果は同じ行で書くこととまったく同じです。バックスラッシュの後に新しいライン文字が続く必要があり、他の文字(スペースなど)がない必要があります。そうしないと、エラーが報告されます。
連結演算子(+)は、複数の単一ライン文字列を連結し、長い文字列を複数の行に分割して書き込むことができます。また、出力時にも単一行です。
var longstring = 'long' + 'long' + 'long' + 'string';
マルチライン文字列を出力する場合は、マルチラインコメントを利用する回避策があります。
(function(){/*line 1line 2line 3*/})。toString()。split( '/n')。slice(1、-1).join( '/n')// "line 1 // line 2 // line 3"上記の例では、出力文字列は複数の行です。
逃げる
Backslash(/)は文字列に特別な意味を持ち、いくつかの特殊文字を表すために使用されるため、エスケープキャラクターとも呼ばれます。
バックスラッシュで脱出する必要がある特殊文字は、主に次のとおりです。
上記のキャラクターの前には、バックスラッシュがあります。これはすべて特別な意味を表しています。
console.log( '1/n2')// 1 // 2
上記のコードでは、 /nは新しい線を意味し、出力時に2行に分割されます。
バックスラッシュには3つの特別な用途があります。
(1)/hhhh
バックスラッシュの後には、キャラクターを表す3つのオクタル数(000〜377)が続きます。 HHHは、 /251が著作権シンボルを表すなど、対応する文字のUnicodeコードポイントに対応します。明らかに、この方法は256文字のみを出力できます。
(2)/xhh
/xの後に、文字を表す2つの16進数(00〜FF)が続きます。 HHは、 /XA9が著作権シンボルを表すなど、文字のUnicodeコードポイントに対応します。この方法は256文字のみを出力できます。
(3)/uxxxxx
/uの後に、文字を表す4つの16進数(0000〜FFFFF)が続きます。 HHHHHは、 /u00A9が著作権シンボルを表すなど、文字のユニコードコードポイントに対応します。
以下は、これら3つの特殊文字の例を詳細に書かれています。
'/251' // "©" '/xa9' // "©" '/u00a9' // "©" '/172' === '' '// true'/x7a '===' z '// true'/u007a '===' z '// true
非専門文字の前にバックスラッシュが使用される場合、バックスラッシュは省略されます。
'/a' // "a"
上記のコードでは、Aは通常の文字であり、その前にバックスラッシュを追加する特別な意味はありません。バックスラッシュは自動的に省略されます。
バックスラッシュを文字列の通常のコンテンツに含める必要がある場合、バックスラッシュの前に別のバックスラッシュを追加する必要があります。
"prev // next" // "prev/ next"
文字列と配列
文字列は文字配列として扱うことができるため、配列の正方形のブラケット演算子を使用して、特定の位置で文字を返すことができます(位置番号は0から始まります)。
var s = 'hello'; s [0] // "h" s [1] // "e" s [4] // "o" //スクエアブラケットオペレーター 'hello' [1] // "e"を使用します
正方形の括弧内の数が文字列の長さを超える場合、または四角い括弧内の数字がまったくない場合、未定義は返されます。
'abc' [3] // undefined'abc '[-1] // undefined'abc' ['x'] //未定義
ただし、それはすべて、文字列と配列の類似性に関するものです。実際、文字列に単一の文字を変更することは不可能です。
var s = 'hello'; delete s [0]; s // "hello" s [1] = 'a'; s // "hello" s [5] = '!'; s // "hello"
上記のコードは、文字列内の個々の文字を変更、追加、削除することができず、これらの操作が静かに失敗することを示しています。
文字列が文字配列に似ている理由は、実際には、文字列で正方形のブラケット操作を実行するときに、文字列が文字列オブジェクトに自動的に変換されるためです。
長さ属性
長さの属性は、文字列の長さを返しますが、変更できません。
var s = 'hello'; s.length // 5s.length = 3; s.length // 5s.length = 7; s.length // 5
上記のコードは、文字列の長さ属性を変更できないことを示していますが、エラーはありません。
文字セット
JavaScriptはUnicode文字セットを使用します。つまり、JavaScript内では、すべての文字がUnicodeで表されることを意味します。
JavaScriptはUnicodeを使用して文字を内部的に保存するだけでなく、Unicodeをプログラムで直接使用することもできます。すべての文字は、「/uxxxx」の形で書くことができます。ここで、xxxxは文字のユニコードエンコードを表します。たとえば、 /u00a9は著作権記号を表します。
var s = '/u00a9'; s // "©"
各文字は、JavaScript内に16ビット(つまり、2バイト)のUTF-16形式に保存されます。つまり、JavaScriptのユニット文字の長さは、16ビットの長さ、つまり2バイトに固定されています。
ただし、UTF-16には2つの長さがあります。U+0000とU+FFFFの間の文字の場合、長さは16ビット(つまり2バイト)です。 u+10000とu+10ffffの間の文字の場合、長さは32ビット(つまり4バイト)、最初の2バイトは0xd800〜0xdbffの間で、最後の2バイトは0xdc00〜0xdfffの間です。たとえば、u+1d306の対応する文字は?であり、UTF-16(0xD834 0xDF06)として記述されています。ブラウザはこれらの4バイトを1つの文字として正しく認識しますが、JavaScript内の文字の長さは常に16ビットに固定されており、これらの4つのバイトは2文字として扱われます。
var s = '/ud834/udf06'; s // "?"
上記のコードは、u+10000とu+10ffffの間の文字の場合、JavaScriptは常に2つの文字として扱われることを示しています(文字の長さ属性は2)。単一の文字を一致させるために使用される正規表現は失敗します(JavaScriptは、複数の文字がここにあると考えています)、Charatメソッドは単一の文字を返すことができず、CharCodeatメソッドは各バイトに対応する小数値を返します。
したがって、これに対処する場合、これを考慮する必要があります。 Cが文字のユニコード番号であると仮定して、4バイトのユニコード文字の場合、Hは最初の2バイトであり、Lは最後の2バイトであり、それらの間の変換関係は次のとおりです。
// u + ffffffよりも大きい文字をユニコードからUTF -16H = math.floor((c -0x10000)/ 0x400) + 0xd800l =(c -0x10000)%0x400 +/ u + fffffよりも大きい文字大きい文字=(c -0x10000)// unicodec =(h -0xd800 +) + 0x10000
次の正規表現は、すべてのUTF-16文字を認識できます。
([/0-/ud7ff/ue000-/ufff] | [/ud800-/udbff] [/udc00-/udff]))
JavaScriptエンジン(厳密に言えば、ES5仕様)は、補助平面のUnicode文字(0xFFFFを超える数)を自動的に認識できないため、すべての文字列処理関数は、そのような文字に遭遇すると誤った結果を生成します。文字列関連操作を完了する場合は、文字が0xD800〜0xDFFFの範囲内に該当するかどうかを判断する必要があります。
以下は、文字列トラバーサルを正しく処理できる関数です。
関数getSymbols(string){var length = string.length; var index = -1; var output = []; var文字; var charcode; while(++ index <length){character = string.charat(index); charcode = character.charcodeat(0); if(charcode> = 0xd800 && charcode <= 0xdbff){output.push(character+string.charat(++ index)); } else {output.push(文字); }} return output;} var symbols = getSymbols( '?'); symbols.foreach(function(symbol){// ...});交換(String.Prototype.Replace)、Intercept Substring(String.Prototype.Substring、String.Prototype.Slice)などの他の文字列操作も同様に処理する必要があります。
base64トランスコーディング
base64は、あらゆる文字を印刷可能な文字に変換できるエンコードメソッドです。このエンコード方法は、主に暗号化ではなく、特殊文字を回避し、プログラムの処理を簡素化するために使用されます。
JavaScriptは、2つのBase64関連の方法をネイティブに提供します。
var string = 'hello world!'; btoa(string)// "sgvsbg8gv29ybgqh" atob( 'sgvsbg8gv29ybgqh')// "hello world!"これらの2つの方法は、ASCII以外の文字には適しておらず、エラーを報告します。 BTOA( 'hello')// contaught domexception:エンコードされる文字列には、latin1範囲外の文字が含まれています。非ASCII文字をBase64エンコーディングに変換するには、トランスコーディングリンクを中央に挿入する必要があり、これらの2つの方法が使用されます。関数b64encode(str){return btoa(encodeuricomponent(str));} function b64decode(str){return decodeuricomponent(atob(str));} b64encode( 'hello')// "Juu0jujejuewjuu1jue1juje" b64decode( 'juu0jujejuewjuu1jue1juje')// "Hello"