string.charAt (x) или string [x]? - PullRequest
227 голосов
/ 10 мая 2011

Есть ли причина, по которой я должен использовать string.charAt(x) вместо обозначения в скобках string[x]?

Ответы [ 6 ]

224 голосов
/ 10 мая 2011

Запись в скобках теперь работает во всех основных браузерах, кроме IE7 и ниже.

// Bracket Notation
"Test String1"[6]

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

Раньше было плохой идеей использовать скобки по этим причинам ( Source ):

Эта запись не работает в IE7. Первый фрагмент кода вернется в IE7 как неопределенный.Если вам случается использовать скобки для строк во всем коде и вы хотите перейти на .charAt(pos), это настоящая проблема: скобки используются во всем коде, и нет простого способа определить, для строки это илимассив / объект.

Вы не можете установить символ, используя эту запись. Поскольку нет никаких предупреждений, это действительно сбивает с толку и расстраивает.Если бы вы использовали функцию .charAt(pos), у вас не было бы соблазна сделать это.

86 голосов
/ 10 мая 2011

С 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).
68 голосов
/ 09 июня 2015

Они могут давать разные результаты в крайних случаях.

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

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

Функция charAt зависит от того, как индекс преобразуется в число в spec .

11 голосов
/ 10 мая 2011

String.charAt () является оригинальным стандартом и работает во всех браузерах. В IE 8+ и других браузерах вы можете использовать скобочные обозначения для доступа к символам, но IE 7 и ниже не поддерживает его.

Если кто-то действительно хочет использовать скобочные обозначения в IE 7, целесообразно преобразовать строку в массив, используя str.split(''), а затем использовать ее как массив, совместимый с любым браузером.

var testString = "Hello"; 
var charArr = testString.split("");
charArr[1]; // "e"
9 голосов
/ 16 июля 2013

Очень интересный результат при тестировании метода доступа к строковому индексу против метода charAt().Кажется, Chrome - единственный браузер, которому нравится charAt больше.

CharAt против индекса 1

ChartAt против индекса 2

Диаграмма против индекса 3

2 голосов
/ 22 февраля 2019

Существует разница при попытке доступа к индексу, который находится за пределами или не является целым числом.

string[x] возвращает символ в x-й позиции в string, если 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 неизменны .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...