Ответы:
Обозначение в скобках теперь работает во всех основных браузерах, кроме 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]возвращает символ в xth-й позиции в stringif, если 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)вернет непригодный символ