Câu trả lời:
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 đó.
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).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ố .
'hello'[undefined] // undefined
và'hello'.charAt(undefined) //h
null
hoạt động như thế undefined
, nhưng hãy xem cái này: "hello"["00"] // undefined
nhưng "hello".charAt("00") // "h"
và"hello"["0"] // "h"
[]
.
.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.
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"
Kết quả rất thú vị khi bạn kiểm tra trình truy cập chỉ mục chuỗi so với charAt()
phương thức. Có vẻ như Chrome là trình duyệt duy nhất thích charAt
nhiều hơn.
index
cũng nhanh hơn trong chrome.
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ự ở x
vị trí thứ trong string
nếu x
là một số nguyên nằm giữa 0 string.length-1
và trả về undefined
khác.
string.charAt(x)
chuyển đổi x
thà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 x
xuống nếu x
là số không nguyên và trả về 0 nếu parseInt(x)
là NaN
) và sau đó trả về ký tự ở vị trí đó nếu số nguyên nằm trong khoảng 0 string.length-1
và 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 .
"😃".charAt(0)
sẽ trả về một ký tự không sử dụng được