Ответы:
Обозначение в скобках теперь работает во всех основных браузерах, кроме IE7 и ниже.
// Bracket Notation
"Test String1"[6]
// charAt Implementation
"Test String1".charAt(6)
Раньше было плохой идеей использовать скобки по следующим причинам ( Источник ):
Эта запись не работает в IE7. Первый фрагмент кода вернет неопределенный в IE7. Если вам случается использовать скобки для строк во всем коде, и вы хотите перейти на них
.charAt(pos)
, это настоящая проблема: скобки используются во всем коде, и нет простого способа определить, для строки это или для массива / объект.Вы не можете установить символ, используя эту запись. Поскольку нет никаких предупреждений, это действительно сбивает с толку и расстраивает. Если бы вы использовали
.charAt(pos)
функцию, у вас не было бы соблазна сделать это.
От MDN :
Есть два способа получить доступ к отдельному символу в строке. Первым является
charAt
метод, часть ECMAScript 3:return 'cat'.charAt(1); // returns "a"
Другой способ - рассматривать строку как массивоподобный объект, где каждый отдельный символ соответствует числовому индексу. Это поддерживается большинством браузеров, начиная с их первой версии, за исключением IE. Это было стандартизировано в ECMAScript 5:
return 'cat'[1]; // returns "a"
Второй способ требует поддержки ECMAScript 5 (и не поддерживается в некоторых старых браузерах).
В обоих случаях попытка изменить отдельный символ не будет работать, так как строки неизменяемы, то есть их свойства не являются ни «доступными для записи», ни «настраиваемыми».
str.charAt(i)
лучше с точки зрения совместимости, если требуется совместимость с IE6 / IE7.str[i]
более современный и работает в IE8 + и во всех других браузерах (все Edge / Firefox / Chrome, Safari 2+, все iOS / Android).Они могут дать разные результаты в крайних случаях.
'hello'[NaN] // undefined
'hello'.charAt(NaN) // 'h'
'hello'[true] //undefined
'hello'.charAt(true) // 'e'
Функция charAt зависит от того, как индекс преобразуется в число в спецификации .
'hello'[undefined] // undefined
и'hello'.charAt(undefined) //h
null
работает как undefined
, но вижу это: "hello"["00"] // undefined
но "hello".charAt("00") // "h"
и"hello"["0"] // "h"
[]
.
.charAt()
выполняет дополнительное преобразование своего параметра в Number
. К вашему сведению, в настоящее время почти нет разницы в производительности.
String.charAt () является оригинальным стандартом и работает во всех браузерах. В IE 8+ и других браузерах вы можете использовать скобочные обозначения для доступа к символам, но IE 7 и ниже не поддерживает его.
Если кто-то действительно хочет использовать скобочную нотацию в IE 7, целесообразно преобразовать строку в массив с помощью, str.split('')
а затем использовать ее как массив, совместимый с любым браузером.
var testString = "Hello";
var charArr = testString.split("");
charArr[1]; // "e"
Очень интересный результат, когда вы проверяете метод доступа к строковому индексу против charAt()
метода. Кажется, Chrome - единственный браузер, который любит charAt
больше.
index
в хроме тоже быстрее.
Есть разница, когда вы пытаетесь получить доступ к индексу, который находится за пределами или не является целым числом.
string[x]
возвращает символ в x
th-й позиции в string
if, если x
это целое число от 0 до string.length-1
, и возвращает в undefined
противном случае.
string.charAt(x)
преобразуется x
в целое число, используя описанный здесь процесс (который в основном округляется x
, если не x
является целым числом, и возвращает 0, если parseInt(x)
есть NaN
), а затем возвращает символ в той позиции, если целое число находится в диапазоне от 0 до string.length-1
, и возвращает пустую строку в противном случае ,
Вот некоторые примеры:
"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
Другое отличие состоит в том, что назначение string[x]
ничего не делает (что может сбить с толку), а присвоение string.charAt(x)
является ошибкой (как и ожидалось):
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
Причина, по которой назначение string[x]
не работает, заключается в том, что строки Javascript неизменны .
"😃".charAt(0)
вернет непригодный символ