回答:
ブラケット表記は、IE7以下を除くすべての主要なブラウザーで機能するようになりました。
// Bracket Notation
"Test String1"[6]
// charAt Implementation
"Test String1".charAt(6)
以下の理由により、括弧を使用することは悪い考えでした(Source):
この表記はIE7では機能しません。 最初のコードスニペットは、IE7では未定義を返します。コード全体で文字列にブラケット表記を使用していて、に移行したい場合
.charAt(pos)
、これは本当の痛みです:ブラケットはコード全体で使用され、それが文字列または配列のどちらであるかを検出する簡単な方法はありません/オブジェクト。この表記法を使用して文字を設定することはできません。いかなる警告もないので、これは本当に混乱し、イライラさせられます。
.charAt(pos)
関数を使用し ていたとしても、それを実行したくはありませんでした。
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)で動作します。エッジケースでは異なる結果が得られる場合があります。
'hello'[NaN] // undefined
'hello'.charAt(NaN) // 'h'
'hello'[true] //undefined
'hello'.charAt(true) // 'e'
charAt関数は、仕様でインデックスがどのようにNumberに変換されるかによって異なります。
'hello'[undefined] // undefined
、'hello'.charAt(undefined) //h
null
作品は好きですundefined
が、これを参照してください"hello"["00"] // undefined
が、"hello".charAt("00") // "h"
と"hello"["0"] // "h"
[]
。
.charAt()
がそのパラメータの追加変換をに実行することも意味しますNumber
。ちなみに、最近のパフォーマンスの違いはほとんどありません。
String.charAt()は元の標準であり、すべてのブラウザで機能します。IE 8以降およびその他のブラウザーでは、ブラケット表記を使用して文字にアクセスできますが、IE 7以前ではサポートされていません。
IE 7で本当にブラケット表記を使用したい場合はstr.split('')
、任意のブラウザーと互換性のあるを使用して文字列を配列に変換し、それを配列として使用するのが賢明です。
var testString = "Hello";
var charArr = testString.split("");
charArr[1]; // "e"
文字列インデックスアクセサーとcharAt()
メソッドをテストすると、非常に興味深い結果が得られます。ChromeはcharAt
もっと好きな唯一のブラウザのようです。
index
chromeでもwayyyが高速です。
範囲外または整数ではないインデックスにアクセスしようとすると、違いがあります。
string[x]
if が0からまでの整数の場合は、x
th番目の文字を返し、それ以外の場合はを返します。string
x
string.length-1
undefined
string.charAt(x)
ここでx
説明するプロセスを使用して整数に変換し(これは基本的に非整数の場合は切り捨てられ、が0の場合は0を返します)、整数が0からの場合はその位置にある文字を返し、そうでない場合は空の文字列を返します。x
x
parseInt(x)
NaN
string.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文字列が不変であるためです。
"😃".charAt(0)