string.charAt(x)
Parantez notasyonu yerine kullanmam gereken herhangi bir neden var mı string[x]
?
string.charAt(x)
Parantez notasyonu yerine kullanmam gereken herhangi bir neden var mı string[x]
?
Yanıtlar:
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.
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.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 .
'hello'[undefined] // undefined
ve'hello'.charAt(undefined) //h
null
gibi çalışır undefined
, ancak bkz: "hello"["00"] // undefined
ama "hello".charAt("00") // "h"
ve"hello"["0"] // "h"
[]
.
.charAt()
parametresi için a Number
. FYI, günümüzde neredeyse hiçbir performans farkı yok.
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"
Dize dizini erişimcisini charAt()
yönteme karşı test ettiğinizde çok ilginç bir sonuç . Chrome, charAt
daha fazlasını seven tek tarayıcı gibi görünüyor .
index
kromda da daha hızlıdır.
Bir tamsayı olmayan veya sınırları olmayan bir dizine erişmeye çalıştığınızda bir fark vardır.
string[x]
if x
konumundaki karakteri 0 ile arasında bir tamsayı olarak döndürür ve aksi halde döndürür .string
x
string.length-1
undefined
string.charAt(x)
dönüştürür x
işlemi kullanılarak bir tam sayıya açıklandığı burada (temelde yuvarlar x
ise aşağı x
olmayan bir tam sayı ve döner ise 0 olduğu parseInt(x)
olduğu NaN
ve daha sonra tam sayı 0 ile ve eğer bu pozisyonda bir karakter verir) string.length-1
boş 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 .
"😃".charAt(0)
kullanılamaz bir karakter döndürür