文字列オブジェクト
概要
String
オブジェクトは、JavaScript によってネイティブに提供される 3 つのラッパー オブジェクトの 1 つであり、文字列オブジェクトの生成に使用されます。
var s1 = 'abc';
var s2 = 新しい文字列('abc');
typeof s1 // "文字列"
typeof s2 // "オブジェクト"
s2.valueOf() // "abc"
上記のコードでは、変数 s1
は文字列、s2
はオブジェクトです。 s2
は文字列オブジェクトであるため、s2.valueOf
メソッドは対応する元の文字列を返します。
文字列オブジェクトは配列のようなオブジェクトです (配列によく似ていますが、配列ではありません)。
新しい文字列('abc')
// 文字列 {0: "a"、1: "b"、2: "c"、長さ: 3}
(new String('abc'))[1] // "b"
上記のコードでは、文字列「abc」に対応する文字列オブジェクトは数値キー(「0」、「1」、「2」)と「length」プロパティを持っているため、配列のように値を取ることができます。
String
オブジェクトは、コンストラクターとして使用されるだけでなく、任意の型の値を文字列に変換するユーティリティ メソッドとしても使用できます。
String(true) // "true"
String(5) // "5"
上記のコードは、ブール値「true」と数値「5」をそれぞれ文字列に変換します。
静的メソッド
String.fromCharCode()
String
オブジェクトによって提供される静的メソッド (つまり、オブジェクト インスタンスではなくオブジェクト自体で定義されたメソッド) は、主に String.fromCharCode()
です。このメソッドのパラメータは Unicode コード ポイントを表す 1 つ以上の数値であり、戻り値はこれらのコード ポイントで構成される文字列です。
String.fromCharCode() // ""
String.fromCharCode(97) // "a"
String.fromCharCode(104, 101, 108, 108, 111)
// "こんにちは"
上記のコードでは、「String.fromCharCode」メソッドのパラメータが空の場合は空の文字列が返され、それ以外の場合はパラメータに対応する Unicode 文字列が返されます。
このメソッドは、「0xFFFF」より大きい Unicode コード ポイントを持つ文字をサポートしていないことに注意してください。つまり、渡されるパラメータは、「0xFFFF」 (つまり、10 進数で 65535) より大きくすることはできません。
String.fromCharCode(0x20BB7)
//「ஷ」
String.fromCharCode(0x20BB7) === String.fromCharCode(0x0BB7)
// 真実
上記のコードでは、「String.fromCharCode」パラメータ「0x20BB7」が「0xFFFF」より大きいため、返される結果にエラーが発生します。 0x20BB7
に対応する文字は中国語の文字 𠮷
ですが、返される結果は別の文字 (コード ポイント 0x0BB7
) です。これは、「String.fromCharCode」がパラメータ値が「0xFFFF」より大きいことを検出し、余分なビットを無視するためです(つまり、「0x20BB7」の「2」を無視します)。
この現象の根本的な原因は、「0xFFFF」より大きいコード ポイントを持つ文字が 4 バイトを占有し、JavaScript がデフォルトで 2 バイト文字をサポートしていることです。この場合、「0x20BB7」は 2 つの文字に分割する必要があります。
String.fromCharCode(0xD842, 0xDFB7)
// "𠮷"
上記のコードで、「0x20BB7」を 2 つの文字「0xD842」と「0xDFB7」に分割すると (つまり、2 バイト文字を 1 つの 4 バイト文字に結合した場合)、正しい結果が得られます。 UTF-16 エンコード方式によって決定される、「0xFFFF」より大きいコード ポイントを持つ文字の 4 バイト表現。
##インスタンスのプロパティ
String.prototype.length
文字列インスタンスの length
プロパティは、文字列の長さを返します。
'abc'.length // 3
##インスタンスメソッド
String.prototype.charAt()
charAt
メソッドは指定された位置にある文字を返します。パラメータは 0
から始まる番号が付けられた位置です。
var s = 新しい文字列('abc');
s.charAt(1) // "b"
s.charAt(s.length - 1) // "c"
このメソッドは配列添字で完全に置き換えることができます。
'abc'.charAt(1) // "b"
'abc'[1] // "b"
引数が負の場合、または文字列の長さ以上の場合、charAt
は空の文字列を返します。
'abc'.charAt(-1) // ""
'abc'.charAt(3) // ""
String.prototype.charCodeAt()
charCodeAt()
メソッドは、文字列内の指定された位置にある Unicode コード ポイント (10 進表現) を返します。これは、String.fromCharCode()
の逆演算と同等です。
'abc'.charCodeAt(1) // 98
上記のコードでは、「abc」の位置 1 の文字は「b」であり、その Unicode コード ポイントは「98」です。
引数を指定しないと、charCodeAt
は最初の文字の Unicode コード ポイントを返します。
'abc'.charCodeAt() // 97
引数が負の場合、または文字列の長さ以上の場合、charCodeAt
は NaN
を返します。
'abc'.charCodeAt(-1) // NaN
'abc'.charCodeAt(4) // NaN
charCodeAt
メソッドによって返される Unicode コード ポイントは 65536 (0xFFFF) を超えないことに注意してください。つまり、2 バイト文字のコード ポイントのみが返されます。 65536 より大きいコード ポイントを持つ文字 (4 バイト文字) に遭遇した場合は、charCodeAt(i)
を読み取るだけでなく、charCodeAt(i+1) を読み取ることも含めて、
charCodeAt を 2 回連続して使用する必要があります。 )
、2 つの値を組み合わせて正確な文字を取得します。
String.prototype.concat()
concat
メソッドは、2 つの文字列を連結し、元の文字列を変更せずに新しい文字列を返すために使用されます。
var s1 = 'abc';
var s2 = 'def';
s1.concat(s2) // "abcdef"
s1 // "ABC"
このメソッドは複数のパラメータを受け入れることができます。
'a'.concat('b', 'c') // "abc"
パラメータが文字列でない場合、「concat」メソッドはまずパラメータを文字列に変換してから連結します。
変数 1 = 1;
変数 2 = 2;
var 3 = '3';
''.concat(one, two, three) // "123"
1 + 2 + 3 // "33"
上記のコードでは、「concat」メソッドがパラメータを文字列に変換して連結するため、3 文字の文字列が返されます。対照的に、プラス演算子は両方のオペランドが数値の場合には型を変換しないため、2 文字の文字列が返されます。
String.prototype.slice()
slice()
メソッドは、元の文字列から部分文字列を削除し、元の文字列を変更せずにそれを返すために使用されます。最初のパラメータは部分文字列の開始位置、2 番目のパラメータは部分文字列の終了位置 (この位置を除く) です。
'JavaScript'.slice(0, 4) // "Java"
2 番目のパラメータを省略した場合は、元の文字列の末尾までの部分文字列を表します。
'JavaScript'.slice(4) // "スクリプト"
パラメータが負の値の場合、末尾からカウントダウンした位置、つまり負の値に文字列の長さを加えた値を示します。
'JavaScript'.slice(-6) // "スクリプト"
'JavaScript'.slice(0, -6) // "Java"
'JavaScript'.slice(-2, -1) // "p"
最初のパラメータが 2 番目のパラメータより大きい場合 (正の場合)、slice()
メソッドは空の文字列を返します。
'JavaScript'.slice(2, 1) // ""
String.prototype.substring()
substring
メソッドは、元の文字列から部分文字列を抽出し、元の文字列を変更せずにそれを返すために使用されます。これは、slice
メソッドとよく似ています。最初のパラメータは部分文字列の開始位置を表し、2 番目の位置は終了位置を表します (返される結果にはこの位置は含まれません)。
'JavaScript'.substring(0, 4) // "Java"
2 番目のパラメータを省略した場合は、元の文字列の末尾までの部分文字列を表します。
'JavaScript'.substring(4) // "スクリプト"
最初のパラメータが 2 番目のパラメータより大きい場合、substring
メソッドは 2 つのパラメータの位置を自動的に置き換えます。
'JavaScript'.substring(10, 4) // "スクリプト"
// と同等
'JavaScript'.substring(4, 10) // "スクリプト"
上記のコードでは、substring
メソッドの 2 つのパラメータを交換し、同じ結果が得られます。
引数が負の数の場合、substring
メソッドは負の数を自動的に 0 に変換します。
'JavaScript'.substring(-3) // "JavaScript"
'JavaScript'.substring(4, -3) // "Java"
上記のコードでは、2 番目の例のパラメーター -3
は自動的に 0
になり、これは 'JavaScript'.substring(4, 0)
と同等です。 2 番目のパラメータが最初のパラメータより小さいため、位置が自動的に交換され、Java
が返されます。
これらのルールは直感に反するため、substring
メソッドは非推奨であり、slice
を優先して使用する必要があります。
String.prototype.substr()
substr
メソッドは、元の文字列から部分文字列を削除し、元の文字列を変更せずにそれを返すために使用されます。これは、slice
および substring
メソッドと同じ効果があります。
substr
メソッドの最初のパラメータは部分文字列の開始位置 (0 から数えます) で、2 番目のパラメータは部分文字列の長さです。
'JavaScript'.substr(4, 6) // "スクリプト"
2 番目のパラメータを省略した場合は、元の文字列の末尾までの部分文字列を表します。
'JavaScript'.substr(4) // "スクリプト"
最初のパラメータが負の数値の場合、逆数計算の文字位置を示します。 2 番目のパラメータが負の数値の場合、自動的に 0 に変換されるため、空の文字列が返されます。
'JavaScript'.substr(-6) // "スクリプト"
'JavaScript'.substr(4, -1) // ""
上記のコードでは、2 番目の例のパラメーター -1
は、部分文字列の長さが 0
であることを示す 0
に自動的に変換されるため、空の文字列が返されます。
String.prototype.indexOf()、String.prototype.lastIndexOf()
indexOf
メソッドは、別の文字列内で最初に出現する文字列の位置を決定するために使用され、返される結果は一致が開始される位置です。 -1
が返された場合は、一致しないことを意味します。
'hello world'.indexOf('o') // 4
'JavaScript'.indexOf('script') // -1
indexOf
メソッドは 2 番目のパラメータも受け入れることができます。これは、この位置から開始して後方一致を意味します。
'hello world'.indexOf('o', 6) // 7
lastIndexOf
メソッドの使用方法は、indexOf
メソッドの使用方法と同じです。主な違いは、lastIndexOf
が末尾からマッチングを開始するのに対し、indexOf
は先頭からマッチングを開始することです。
'hello world'.lastIndexOf('o') // 7
さらに、「lastIndexOf」の第 2 パラメータは、この位置から前方に一致することを示します。
'hello world'.lastIndexOf('o', 6) // 4
String.prototype.trim()
trim
メソッドは、文字列の両端のスペースを削除し、元の文字列を変更せずに新しい文字列を返すために使用されます。
「ハローワールド」.trim()
// "こんにちは世界"
このメソッドはスペースだけでなく、タブ文字 (\t
、\v
)、改行文字 (\n
)、およびキャリッジ リターン (\r
) も削除します。
'\r\nabc \t'.trim() // 'abc'
String.prototype.toLowerCase()、String.prototype.toUpperCase()
toLowerCase
メソッドは文字列をすべて小文字に変換するために使用され、toUpperCase
はすべての文字列を大文字に変換するために使用されます。これらはすべて、元の文字列を変更せずに新しい文字列を返します。
'Hello World'.toLowerCase()
// "こんにちは世界"
'Hello World'.toUpperCase()
// "こんにちは世界"
String.prototype.match()
match
メソッドは、元の文字列が特定の部分文字列に一致するかどうかを判断するために使用され、最初に一致した文字列をメンバーとする配列を返します。一致するものが見つからない場合は、「null」が返されます。
'猫、コウモリ、土、脂肪'.match('at') // ["at"]
'猫、コウモリ、サット、ファット'.match('xt') // null
返された配列には、「index」属性と「input」属性もあり、それぞれ一致する文字列と元の文字列の開始位置を表します。
varmatch = '猫、コウモリ、サット、ファット'.match('at');
マッチ.インデックス // 1
matches.input // "猫、コウモリ、土、脂肪"
match
メソッドはパラメータとして正規表現を使用することもできます。詳細については、「正規表現」の章を参照してください。
String.prototype.search()、String.prototype.replace()
search
メソッドの使用法は基本的に match
と同じですが、戻り値は一致の最初の位置になります。一致するものが見つからない場合は、「-1」が返されます。
'猫、コウモリ、土、脂肪'.search('at') // 1
search
メソッドではパラメータとして正規表現を使用することもできます。詳細については、「正規表現」セクションを参照してください。
replace
メソッドは、一致する部分文字列を置換するために使用されます。通常は、最初の一致のみが置換されます (g
修飾子を含む正規表現が使用されている場合を除く)。
'aaa'.replace('a', 'b') // "ばあ"
「replace」メソッドではパラメータとして正規表現を使用することもできます。詳細については「正規表現」セクションを参照してください。
String.prototype.split()
split
メソッドは、指定されたルールに従って文字列を分割し、分割された部分文字列で構成される配列を返します。
'a|b|c'.split('|') // ["a", "b", "c"]
分割ルールが空の文字列の場合、返される配列のメンバーは元の文字列の各文字になります。
'a|b|c'.split('') // ["a", "|", "b", "|", "c"]
パラメーターを省略した場合、返される配列の唯一のメンバーは元の文字列です。
'a|b|c'.split() // ["a|b|c"]
分割ルールを満たす 2 つの部分がすぐに隣接している (つまり、2 つの区切り文字の間に他の文字がない) 場合、返される配列には空の文字列が含まれます。
'a||c'.split('|') // ['a', '', 'c']
分割ルールを満たす部分が文字列の先頭または末尾にある場合 (つまり、その前後に他の文字がない場合)、返される配列の最初または最後のメンバーは空の文字列になります。
'|b|c'.split('|') // ["", "b", "c"]
'a|b|'.split('|') // ["a", "b", ""]
split
メソッドは、返される配列のメンバーの最大数を制限する 2 番目のパラメータを受け入れることもできます。
'a|b|c'.split('|', 0) // []
'a|b|c'.split('|', 1) // ["a"]
'a|b|c'.split('|', 2) // ["a", "b"]
'a|b|c'.split('|', 3) // ["a", "b", "c"]
'a|b|c'.split('|', 4) // ["a", "b", "c"]
上記のコードでは、split
メソッドの 2 番目のパラメーターによって、返される配列のメンバーの数が決まります。
「split」メソッドではパラメータとして正規表現を使用することもできます。詳細については「正規表現」セクションを参照してください。
String.prototype.localeCompare()
localeCompare
メソッドは 2 つの文字列を比較するために使用されます。整数が 0 より小さい場合は、最初の文字列が 2 番目の文字列より小さいことを意味し、0 に等しい場合は、2 つが等しいことを意味します。最初の文字列は 2 番目の文字列より大きいです。
'apple'.localeCompare('banana') // -1
'apple'.localeCompare('apple') // 0
この手法の最大の特徴は、自然言語の順序を考慮していることです。たとえば、通常、英語の大文字は小文字よりも小さくなります。
'B' > 'a' // false
上記のコードでは、文字「B」は文字「a」よりも小さくなります。 JavaScript は Unicode コード ポイント比較を使用するため、「B」のコード ポイントは 66、「a」のコード ポイントは 97 です。
ただし、localeCompare
メソッドは自然言語のソート状況を考慮し、a
よりも先に B
をランク付けします。
'B'.localeCompare('a') // 1
上記のコードでは、「localeCompare」メソッドは整数 1 を返し、「B」の方が大きいことを示します。
localeCompare
には 2 番目のパラメータを指定して、使用する言語 (デフォルトは英語) を指定し、その言語の規則に従って比較することもできます。
'ä'.localeCompare('z', 'de') // -1
'ä'.localeCompare('z', 'sv') // 1
上記のコードでは、「de」はドイツ語を意味し、「sv」はスウェーデン語を意味します。ドイツ語では、「ä」は「z」より小さいため、「-1」が返されます。スウェーデン語では、「ä」は「z」より大きいため、「1」が返されます。
参考リンク
- アリヤ・ヒダヤット、JavaScript 文字列: substring、substr、slice
作者: wangdoc
アドレス: https://wangdoc.com/
ライセンス: クリエイティブ・コモンズ 3.0