string.charAt(x)またはstring [x]?


回答:


243

ブラケット表記は、IE7以下を除くすべての主要なブラウザーで機能するようになりました。

// Bracket Notation
"Test String1"[6]

// charAt Implementation
"Test String1".charAt(6)

以下の理由により、括弧を使用することは悪い考えでした(Source):

この表記はIE7では機能しません。 最初のコードスニペットは、IE7では未定義を返します。コード全体で文字列にブラケット表記を使用していて、に移行したい場合.charAt(pos)、これは本当の痛みです:ブラケットはコード全体で使用され、それが文字列または配列のどちらであるかを検出する簡単な方法はありません/オブジェクト。

この表記法を使用して文字を設定することはできません。いかなる警告もないので、これは本当に混乱し、イライラさせられます。.charAt(pos)関数を使用し ていたとしても、それを実行したくはありませんでした。


21
確かに、この表記法はIE7では機能しませんが、現在ではそれほど大きな欠点ではありません。一方、私が行ったベンチマークでは、文字列がオブジェクトにボックス化されている場合、ChromeでcharAtとindexerを使用すると、パフォーマンスが3倍低下しました。私はそれが本当に関連しているわけではないことを知っていますが、それでも注目に値します。jsfiddle.net/mdasxxd2
Siderite Zackwehdex 2016

5
より正確なテスト(benchmark.js)esbench.com/bench/579609a0db965b9a00965b9e
NoNameProvided 2016

3
最高得点であるにもかかわらず、この回答は現在(2019)大幅に古くなっています。代わりに、MDN引用した以下の回答を参照してください。
スコットマーティン

97

MDNから:

文字列内の個々の文字にアクセスするには、2つの方法があります。1つはcharAtメソッドで、ECMAScript 3の一部です。

return 'cat'.charAt(1); // returns "a"

もう1つの方法は、文字列を配列のようなオブジェクトとして扱うことです。この場合、個々の文字は数値インデックスに対応します。これは、IEを除いて、最初のバージョン以降、ほとんどのブラウザーでサポートされています。ECMAScript 5で標準化されました。

return 'cat'[1]; // returns "a"

2番目の方法ではECMAScript 5のサポートが必要です(一部の古いブラウザーではサポートされていません)。

どちらの場合も、文字列は不変であるため、個々の文字を変更しようとしても機能しません。つまり、それらのプロパティは「書き込み可能」でも「構成可能」でもありません。

  • str.charAt(i) IE6 / IE7の互換性が必要な場合は、互換性の観点から優れています。
  • str[i] よりモダンで、IE8 +と他のすべてのブラウザー(すべてのEdge / Firefox / Chrome、Safari 2+、すべてのiOS / Android)で動作します。

19
確かに、ECMA 5は、まだすべてのブラウザでサポートされていませんが、それはほとんどのブラウザでサポートされています:IE9を意味し、上とすべてのクローム/ Firefoxバージョン: kangax.github.io/compat-table/es5/#Property_access_on_strings ませんJSの特色にする今までに100%サポートされており、ECMA 5機能の使用を回避することで、過去の私たちを永遠に残すことができると思います...
Danny R

83

エッジケースでは異なる結果が得られる場合があります。

'hello'[NaN] // undefined
'hello'.charAt(NaN) // 'h'

'hello'[true] //undefined
'hello'.charAt(true) // 'e'

charAt関数は、仕様でインデックスがどのようにNumberに変換されるかによって異なります。


また'hello'[undefined] // undefined'hello'.charAt(undefined) //h
ファンメンデス

3
null作品は好きですundefinedが、これを参照してください"hello"["00"] // undefinedが、"hello".charAt("00") // "h""hello"["0"] // "h"
panzi

11
これは、私が心をこめて使用し続けることを納得させます[]
DarknessFishへの接近

これは、.charAt()がそのパラメータの追加変換をに実行することも意味しますNumber。ちなみに、最近のパフォーマンスの違いはほとんどありません。
КонстантинВан

7
この答えは上に移動するはずです。実際には、2つの方法には違いがあることを説明しています。他の回答ではIE7の互換性について説明しています(本当にそうですか?)。この回答は非常に実際の落とし穴を説明しています。
Storm Muller

11

String.charAt()は元の標準であり、すべてのブラウザで機能します。IE 8以降およびその他のブラウザーでは、ブラケット表記を使用して文字にアクセスできますが、IE 7以前ではサポートされていません。

IE 7で本当にブラケット表記を使用したい場合はstr.split('')、任意のブラウザーと互換性のあるを使用して文字列を配列に変換し、それを配列として使用するのが賢明です。

var testString = "Hello"; 
var charArr = testString.split("");
charArr[1]; // "e"

5
IEは、8以降のブラケット表記をサポートしています。
mrec

3
このメソッドは、Unicodeを処理するときに壊れます:mathiasbynens.be/notes/javascript-unicode
Jeremy J Starcher

このメソッドは、メモリ内のデータ(元の文字列と配列)を複製するため、非常に大きな文字列を処理する場合は非効率的です。
ダニエル


5

範囲外または整数ではないインデックスにアクセスしようとすると、違いがあります。

string[x]if が0からまでの整数の場合は、xth番目の文字を返し、それ以外の場合はを返します。stringxstring.length-1undefined

string.charAt(x)ここでx説明するプロセスを使用して整数に変換し(これは基本的に非整数の場合は切り捨てられ、が0の場合は0を返します)、整数が0からの場合はその位置にある文字を返し、そうでない場合は空の文字列を返します。xxparseInt(x)NaNstring.length-1

ここではいくつかの例を示します。

"Hello"[313]    //undefined
"Hello".charAt(313)    //"", 313 is out of bounds

"Hello"[3.14]    //undefined
"Hello".charAt(3.14)    //'l', rounds 3.14 down to 3

"Hello"[true]    //undefined
"Hello".charAt(true)    //'e', converts true to the integer 1

"Hello"["World"]    //undefined
"Hello".charAt("World")    //'H', "World" evaluates to NaN, which gets converted to 0

"Hello"[Infinity]    //undefined
"Hello".charAt(Infinity)    //"", Infinity is out of bounds

別の違いは、への代入string[x]は何もしない(混乱を招く可能性があります)とへの代入string.charAt(x)は(予想どおり)エラーであることです。

var str = "Hello";
str[0] = 'Y';
console.log(str);    //Still "Hello", the above assignment did nothing
str.charAt(0) = 'Y';    //Error, invalid left-hand side in assignment

への割り当てがstring[x]機能しない理由は、JavaScript文字列が不変であるためです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.