chuỗi.charAt (x) hoặc chuỗi [x]?


Câu trả lời:


243

Ký hiệu khung giờ hoạt động trên tất cả các trình duyệt chính, ngoại trừ IE7 trở xuống.

// Bracket Notation
"Test String1"[6]

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

Nó từng là một ý tưởng tồi để sử dụng dấu ngoặc, vì những lý do này ( Nguồn ):

Ký hiệu này không hoạt động trong IE7. Đoạn mã đầu tiên sẽ trả về không xác định trong IE7. Nếu bạn tình cờ sử dụng ký hiệu dấu ngoặc cho các chuỗi trên toàn bộ mã của bạn và bạn muốn di chuyển đến .charAt(pos), thì đây là một nỗi đau thực sự: Chân đế được sử dụng trên toàn bộ mã của bạn và không có cách nào dễ dàng để phát hiện nếu đó là một chuỗi hoặc một mảng / vật.

Bạn không thể thiết lập ký tự bằng cách sử dụng ký hiệu này. Vì không có bất kỳ cảnh báo nào, điều này thực sự khó hiểu và bực bội. Nếu bạn đang sử dụng .charAt(pos)chức năng, bạn sẽ không muốn làm điều đó.


21
Đúng, ký hiệu không hoạt động trong IE7, nhưng đó không phải là một bất lợi lớn hiện nay. Trong khi đó, điểm chuẩn tôi đã cho thấy hiệu suất giảm ba lần khi sử dụng charAt so với bộ chỉ mục trong Chrome khi chuỗi được đóng hộp trong một đối tượng. Tôi biết điều đó không thực sự phù hợp, nhưng vẫn đáng chú ý. jsfiddle.net/mdasxxd2
Siderite Zackwehdex

5
Một thử nghiệm chính xác hơn (điểm chuẩn) esbench.com/bench/579609a0db965b9a00965b9e
NoNameProvided

3
Mặc dù được đánh giá cao nhất nhưng câu trả lời này hiện đã hết (2019). Câu trả lời dưới đây trích dẫn MDN nên được tham khảo thay thế.
Scott Martin

97

Từ MDN :

Có hai cách để truy cập một ký tự riêng lẻ trong một chuỗi. Đầu tiên làcharAt phương thức, một phần của ECMAScript 3:

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

Một cách khác là coi chuỗi là một đối tượng giống như mảng, trong đó mỗi ký tự riêng lẻ tương ứng với một chỉ số bằng số. Điều này đã được hầu hết các trình duyệt hỗ trợ kể từ phiên bản đầu tiên của họ, ngoại trừ IE. Nó đã được chuẩn hóa trong ECMAScript 5:

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

Cách thứ hai yêu cầu hỗ trợ ECMAScript 5 (và không được hỗ trợ trong một số trình duyệt cũ hơn).

Trong cả hai trường hợp, cố gắng thay đổi một ký tự riêng lẻ sẽ không hoạt động, vì các chuỗi là bất biến, tức là, các thuộc tính của chúng không phải là "có thể ghi" hay "có thể cấu hình".

  • str.charAt(i) là tốt hơn từ góc độ tương thích nếu cần tương thích IE6 / IE7.
  • str[i] hiện đại hơn và hoạt động trong IE8 + và tất cả các trình duyệt khác (tất cả Edge / Firefox / Chrome, Safari 2+, tất cả iOS / Android).

19
Đúng, ECMA 5 chưa được hỗ trợ trên TẤT CẢ các trình duyệt, nhưng nó được hỗ trợ trên các trình duyệt MOST: có nghĩa là IE9 trở lên và tất cả các phiên bản Chrome / Firefox: kangax.github.io/compat-table/es5/#Property_access_on_strings Không có tính năng JS nào được hỗ trợ 100% và tôi cảm thấy rằng việc tránh sử dụng các tính năng ECMA 5 sẽ khiến chúng ta mãi mãi ...
Danny R

83

Họ có thể cho kết quả khác nhau trong các trường hợp cạnh.

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

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

Hàm charAt phụ thuộc vào cách chỉ mục được chuyển đổi thành Số trong thông số .


Ngoài ra 'hello'[undefined] // undefined'hello'.charAt(undefined) //h
Juan Mendes

3
nullhoạt động như thế undefined, nhưng hãy xem cái này: "hello"["00"] // undefinednhưng "hello".charAt("00") // "h""hello"["0"] // "h"
panzi

11
Điều này hết lòng thuyết phục tôi tiếp tục sử dụng [].
Tiếp

Điều này cũng có nghĩa là .charAt()thực hiện một chuyển đổi bổ sung cho tham số của nó thành a Number. FYI, ngày nay hầu như không có sự khác biệt về hiệu suất.
Toàn cảnh

7
Câu trả lời này sẽ di chuyển lên, nó thực sự giải thích rằng có một sự khác biệt giữa 2 phương pháp. Các câu trả lời khác nói về khả năng tương thích cho IE7 (ý tôi thực sự là vậy?) Trong khi câu trả lời này giải thích một cạm bẫy rất thực tế.
Bão Muller

11

String.charAt () là tiêu chuẩn ban đầu và hoạt động trong tất cả các trình duyệt. Trong IE 8+ và các trình duyệt khác, bạn có thể sử dụng ký hiệu ngoặc để truy cập các ký tự nhưng IE 7 trở xuống không hỗ trợ nó.

Nếu ai đó thực sự muốn sử dụng ký hiệu ngoặc trong IE 7, thì nên chuyển đổi chuỗi thành một mảng bằng cách sử dụng str.split('')và sau đó sử dụng nó như một mảng, tương thích với bất kỳ trình duyệt nào.

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

5
IE hỗ trợ ký hiệu khung từ 8 trở đi.
mrec

3
Phương pháp này bị hỏng khi giao dịch với Unicode: mathiasbynens.be/notes/javascript-unicode
Jeremy J Starcher

Phương pháp này sẽ không hiệu quả khi xử lý các chuỗi thực sự lớn vì nó sẽ nhân đôi dữ liệu trong bộ nhớ (chuỗi gốc và mảng).
Daniel


5

Có một sự khác biệt khi bạn cố gắng truy cập một chỉ mục nằm ngoài giới hạn hoặc không phải là số nguyên.

string[x]trả về ký tự ở xvị trí thứ trong stringnếu xlà một số nguyên nằm giữa 0 string.length-1và trả về undefinedkhác.

string.charAt(x)chuyển đổi xthành một số nguyên bằng cách sử dụng quy trình được giải thích ở đây (về cơ bản làm tròn xxuống nếu xlà số không nguyên và trả về 0 nếu parseInt(x)NaN) và sau đó trả về ký tự ở vị trí đó nếu số nguyên nằm trong khoảng 0 string.length-1và ngược lại trả về một chuỗi trống .

Dưới đây là một số ví dụ:

"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

Một sự khác biệt nữa là việc gán string[x]không làm gì (có thể gây nhầm lẫn) và gán cho string.charAt(x)là một lỗi (như mong đợi):

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

Lý do tại sao gán cho string[x]không hoạt động là vì chuỗi Javascript là bất biến .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.