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

246

Apakah ada alasan saya harus menggunakan string.charAt(x)notasi braket string[x]?

Blender
sumber
3
Peringatan : menggunakan sintaks untuk emoji atau karakter unicode lainnya yang melewati BPM Pesawat Multilingual Dasar (AKA "Astral Plane" ) "😃".charAt(0)akan mengembalikan karakter yang tidak dapat digunakan
KyleMit

Jawaban:

243

Notasi braket sekarang berfungsi di semua browser utama, kecuali untuk IE7 dan di bawahnya.

// Bracket Notation
"Test String1"[6]

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

Dulu itu ide yang buruk untuk menggunakan tanda kurung, karena alasan ini ( Sumber ):

Notasi ini tidak berfungsi di IE7. Cuplikan kode pertama akan kembali tidak terdefinisi di IE7. Jika Anda menggunakan notasi braket untuk string di seluruh kode Anda dan Anda ingin bermigrasi .charAt(pos), ini benar-benar menyusahkan: Kurung digunakan di seluruh kode Anda dan tidak ada cara mudah untuk mendeteksi apakah itu untuk string atau array / obyek.

Anda tidak dapat mengatur karakter menggunakan notasi ini. Karena tidak ada peringatan dalam bentuk apa pun, ini benar-benar membingungkan dan membuat frustrasi. Jika Anda menggunakan .charAt(pos)fungsi ini, Anda tidak akan tergoda untuk melakukannya.

Brian Webster
sumber
21
Benar, notasi tidak berfungsi di IE7, tapi itu bukan kerugian besar saat ini. Sementara itu, tolok ukur yang saya lakukan menunjukkan penurunan tiga kali dalam kinerja ketika menggunakan charAt vs indexer di Chrome ketika string dikotakkan dalam suatu objek. Saya tahu itu tidak benar-benar relevan, tetapi masih perlu diperhatikan. jsfiddle.net/mdasxxd2
Siderite Zackwehdex
5
Tes yang lebih akurat (benchmark.js) esbench.com/bench/579609a0db965b9a00965b9e
NoNameProvided
3
Meskipun mendapat skor tertinggi, jawaban ini sekarang (2019) sudah ketinggalan zaman. Jawaban di bawah ini dengan mengutip MDN harus dirujuk sebagai gantinya.
Scott Martin
97

Dari MDN :

Ada dua cara untuk mengakses karakter individu dalam sebuah string. Yang pertama adalah charAtmetode, bagian dari ECMAScript 3:

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

Cara lain adalah memperlakukan string sebagai objek mirip array, di mana masing-masing karakter sesuai dengan indeks numerik. Ini telah didukung oleh sebagian besar browser sejak versi pertama mereka, kecuali untuk IE. Itu distandarisasi dalam ECMAScript 5:

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

Cara kedua membutuhkan dukungan ECMAScript 5 (dan tidak didukung di beberapa browser lama).

Dalam kedua kasus, berusaha mengubah karakter individu tidak akan berfungsi, karena string tidak dapat diubah, yaitu, sifat mereka tidak baik "dapat ditulis" maupun "dapat dikonfigurasi".

  • str.charAt(i) lebih baik dari perspektif kompatibilitas jika kompatibilitas IE6 / IE7 diperlukan.
  • str[i] lebih modern dan berfungsi di IE8 + dan semua browser lainnya (semua Edge / Firefox / Chrome, Safari 2+, semua iOS / Android).
Matt Ball
sumber
19
Benar, ECMA 5 belum didukung pada SEMUA browser, tetapi didukung pada PALING browser: artinya IE9 dan di atas dan semua versi Chrome / Firefox: kangax.github.io/compat-table/es5/#Property_access_on_strings Tidak ada fitur JS yang akan pernah ada didukung 100%, dan saya merasa bahwa menghindari penggunaan fitur ECMA 5 akan meninggalkan kita di masa lalu selamanya ...
Danny R
83

Mereka dapat memberikan hasil yang berbeda dalam kasus tepi.

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

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

Fungsi karakter tergantung pada bagaimana indeks dikonversi ke Nomor dalam spesifikasi .

MarkG
sumber
Juga 'hello'[undefined] // undefineddan'hello'.charAt(undefined) //h
Juan Mendes
3
nullbekerja seperti undefined, tapi lihat ini: "hello"["00"] // undefinedtapi "hello".charAt("00") // "h"dan"hello"["0"] // "h"
panzi
11
Dengan sepenuh hati meyakinkan saya untuk terus menggunakan [].
ApproachingDarknessFish
Ini juga berarti .charAt()melakukan konversi ekstra untuk parameternya menjadi a Number. FYI, hampir tidak ada perbedaan kinerja saat ini.
Константин Ван
7
Jawaban ini harus naik, itu sebenarnya menjelaskan bahwa ada perbedaan antara 2 metode. Jawaban lain berbicara tentang kompatibilitas untuk IE7 (maksud saya benar-benar?) Sementara jawaban ini menjelaskan perangkap yang sangat nyata.
Storm Muller
11

String.charAt () adalah standar asli dan berfungsi di semua browser. Di IE 8+ dan browser lain, Anda dapat menggunakan notasi braket untuk mengakses karakter tetapi IE 7 dan di bawahnya tidak mendukungnya.

Jika seseorang benar-benar ingin menggunakan notasi braket di IE 7, lebih baik untuk mengubah string ke array menggunakan str.split('')dan kemudian menggunakannya sebagai array, kompatibel dengan browser apa pun.

var testString = "Hello"; 
var charArr = testString.split("");
charArr[1]; // "e"
CharithJ
sumber
5
IE mendukung notasi braket mulai 8 dan seterusnya.
mrec
3
Metode ini rusak ketika berhadapan dengan Unicode: mathiasbynens.be/notes/javascript-unicode
Jeremy J Starcher
Metode ini akan tidak efisien ketika berhadapan dengan string yang sangat besar karena akan menduplikasi data dalam memori (string asli dan array).
Daniel
5

Ada perbedaan ketika Anda mencoba mengakses indeks yang di luar batas atau bukan bilangan bulat.

string[x]mengembalikan karakter pada xposisi th stringjika xbilangan bulat antara 0 dan string.length-1, dan mengembalikan undefinedsebaliknya.

string.charAt(x)mualaf xke integer menggunakan proses dijelaskan disini (yang pada dasarnya putaran xbawah jika xadalah nomor non-integer dan kembali 0 jika parseInt(x)ini NaN) dan kemudian kembali karakter pada posisi bahwa jika bilangan bulat adalah antara 0 dan string.length-1, dan kembali string kosong jika tidak .

Berikut ini beberapa contohnya:

"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

Perbedaan lain adalah bahwa menugaskan untuk string[x]tidak melakukan apa-apa (yang dapat membingungkan) dan menugaskan string.charAt(x)adalah kesalahan (seperti yang diharapkan):

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

Alasan mengapa penetapan string[x]tidak berfungsi adalah karena string Javascript tidak dapat diubah .

Donald Bebek
sumber