string.charAt (x) veya string [x]?


Yanıtlar:


243

Köşeli ayraç notasyonu artık IE7 ve altı dışındaki tüm önemli tarayıcılarda çalışır.

// Bracket Notation
"Test String1"[6]

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

Bu nedenlerden dolayı parantez kullanmak kötü bir fikirdi ( Kaynak ):

Bu gösterim IE7'de çalışmaz. İlk kod snippet'i IE7'de tanımsız olarak dönecektir. Kodunuzun her yerinde dizeler için köşeli parantez gösterimini kullanırsanız ve taşımak istiyorsanız .charAt(pos), bu gerçek bir acıdır: Parantezler kodunuzun her yerinde kullanılır ve bunun bir dize veya dizi / nesne.

Bu gösterimi kullanarak karakteri ayarlayamazsınız. Herhangi bir uyarı olmadığından, bu gerçekten kafa karıştırıcı ve sinir bozucudur. Bu .charAt(pos)işlevi kullanıyorsanız , bunu yapmak için cazip olmazdınız.


21
Doğru, gösterim IE7'de işe yaramaz, ancak bugünlerde büyük bir dezavantaj değildir. Bu arada, ölçütler, bir nesnede dize kutlandığında Chrome'da charAt vs indexer kullanılırken performansta üç kez azalma olduğunu gösterdim. Bunun gerçekten alakalı olmadığını, ancak yine de kayda değer olduğunu biliyorum. jsfiddle.net/mdasxxd2
Siderite Zackwehdex

5
Daha doğru bir test (benchmark.js) esbench.com/bench/579609a0db965b9a00965b9e
NoNameProvided

3
En yüksek puan alan olmasına rağmen, bu cevap şimdi (2019) önemli ölçüde güncel değil. MDN'yi alıntılayan aşağıdaki cevaba değinilmelidir.
Scott Martin

97

Gönderen MDN'yi :

Bir dizede tek bir karaktere erişmenin iki yolu vardır. Birincisi charAt, ECMAScript 3'ün bir parçası olan yöntemdir:

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

Diğer yol, dizeyi, her bir karakterin sayısal bir dizine karşılık geldiği dizi benzeri bir nesne olarak işlemektir. IE hariç, ilk sürümlerinden beri çoğu tarayıcı tarafından desteklenmiştir. ECMAScript 5'te standardize edilmiştir:

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

İkinci yol ECMAScript 5 desteği gerektirir (ve bazı eski tarayıcılarda desteklenmez).

Her iki durumda da, dizeleri değiştirilemez olduğu için tek bir karakteri değiştirmeye çalışmak işe yaramaz, yani özellikleri ne "yazılabilir" ne de "yapılandırılabilir" değildir.

  • str.charAt(i) IE6 / IE7 uyumluluğu gerekiyorsa uyumluluk açısından daha iyidir.
  • str[i] daha modern ve IE8 + ve diğer tüm tarayıcılarda (tüm Edge / Firefox / Chrome, Safari 2+, tüm iOS / Android) çalışır.

19
Doğru, ECMA 5 henüz TÜM tarayıcılarda desteklenmiyor, ancak ÇOK tarayıcılarda destekleniyor: IE9 ve üstü ve tüm Chrome / Firefox sürümleri: kangax.github.io/compat-table/es5/#Property_access_on_strings JS özelliği hiç olmayacak % 100 desteklenecek ve ECMA 5 özelliklerinin kullanılmasından kaçınmanın bizi geçmişte sonsuza dek bırakacağını hissediyorum ...
Danny R

83

Uç durumlarda farklı sonuçlar verebilirler.

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

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

CharAt işlevi, dizinin spesifikasyondaki bir Sayıya nasıl dönüştürüldüğüne bağlıdır .


Ayrıca 'hello'[undefined] // undefinedve'hello'.charAt(undefined) //h
Juan Mendes

3
nullgibi çalışır undefined, ancak bkz: "hello"["00"] // undefinedama "hello".charAt("00") // "h"ve"hello"["0"] // "h"
panzi

11
Bu yürekten beni kullanmaya devam etmeye ikna ediyor [].
ApproachingDarknessFish

Bu aynı zamanda .charAt()parametresi için a Number. FYI, günümüzde neredeyse hiçbir performans farkı yok.
Константин Ван

7
Bu cevap yükselmeli, aslında 2 yöntem arasında bir fark olduğunu açıklıyor. Diğer cevaplar IE7 için uyumluluk hakkında konuşuyor (gerçekten mi?) Bu cevap çok gerçek bir tuzağı açıklıyor.
Storm Muller

11

String.charAt () orijinal standarttır ve tüm tarayıcılarda çalışır. IE 8+ ve diğer tarayıcılarda, karakterlere erişmek için köşeli parantez gösterimini kullanabilirsiniz, ancak IE 7 ve aşağısı bunu desteklemedi.

Birisi gerçekten IE 7'de parantez gösterimini kullanmak istiyorsa, dizeyi kullanarak str.split('')herhangi bir tarayıcıyla uyumlu bir dizi olarak dizeye dönüştürmek akıllıca olacaktır .

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

5
IE, 8'den itibaren dirsek gösterimini destekler.
mrec

3
Unicode ile uğraşırken bu yöntem kırılır: mathiasbynens.be/notes/javascript-unicode
Jeremy J Starcher

Bu yöntem gerçekten büyük dizelerle uğraşırken verimsiz olur çünkü bellekteki verileri (orijinal dize ve dizi) çoğaltır.
Daniel


5

Bir tamsayı olmayan veya sınırları olmayan bir dizine erişmeye çalıştığınızda bir fark vardır.

string[x]if xkonumundaki karakteri 0 ile arasında bir tamsayı olarak döndürür ve aksi halde döndürür .stringxstring.length-1undefined

string.charAt(x)dönüştürür xişlemi kullanılarak bir tam sayıya açıklandığı burada (temelde yuvarlar xise aşağı xolmayan bir tam sayı ve döner ise 0 olduğu parseInt(x)olduğu NaNve daha sonra tam sayı 0 ile ve eğer bu pozisyonda bir karakter verir) string.length-1boş bir dize Aksi belirtilmediği taktirde ve döner .

İşte bazı örnekler:

"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

Başka bir fark, atamaya string[x]hiçbir şey yapmamaktır (kafa karıştırıcı olabilir) ve atamanın string.charAt(x)bir hatadır (beklendiği gibi):

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

Atamanın neden string[x]işe yaramadığının nedeni Javascript dizelerinin değişmez olmasıdır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.