string.charAt (x) або string [x]?


247

Чи є якась причина, яку я повинен використовувати string.charAt(x)замість позначення дужок string[x]?


3
Слово застереження : використання синтаксису для емоджи або будь-яких інших символів унікоду, що проходять через базову багатомовну площину BPM (AKA - "Астральна площина" ) "😃".charAt(0), поверне непридатний символ
KyleMit

Відповіді:


243

Нотація дужок тепер працює у всіх основних браузерах, крім IE7 та нижче.

// Bracket Notation
"Test String1"[6]

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

Раніше було поганою ідеєю використовувати дужки з цих причин ( Джерело ):

Це позначення не працює в IE7. Перший фрагмент коду повернеться невизначеним в IE7. Якщо ви хочете використовувати позначення дужок для рядків у всьому коді, і ви хочете перейти до них .charAt(pos), це справжній біль: дужки використовуються у всьому коді, і немає простого способу визначити, чи це для рядка чи масиву / об’єкт.

Ви не можете встановити символ за допомогою цього позначення. Оскільки жодних попереджень немає, це дійсно заплутано і засмучує. Якби ви використовували цю .charAt(pos)функцію, ви б не спокусилися це зробити.


21
Щоправда, позначення не працює в IE7, але це не є величезним недоліком на сьогодні. Тим часом, тести, які я робив, показали триразове зниження продуктивності при використанні charAt vs індексатора в Chrome, коли рядок розміщено в об'єкті. Я знаю, що це не дуже актуально, але все ж варто зазначити. jsfiddle.net/mdasxxd2
Siderite Zackwehdex

5
Більш точний тест (benchmark.js) esbench.com/bench/579609a0db965b9a00965b9e
NoNameProvided

3
Незважаючи на те, що найбільше набрали, ця відповідь зараз (2019) суттєво застаріла. Натомість слід посилатися на відповідь із цитуванням MDN .
Скотт Мартін

97

Від 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).

19
Правда, ECMA 5 ще не підтримується у ВСІХ браузерах, але він підтримується у БОЖИХ браузерах: означає IE9 і вище та всіх версіях Chrome / Firefox: kangax.github.io/compat-table/es5/#Property_access_on_strings Ніякої функції JS ніколи не буде будьте на 100% підтримані, і я вважаю, що уникнення використання функцій ECMA 5 назавжди залишить нас у минулому ...
Danny R

83

Вони можуть дати різні результати у кращих випадках.

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

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

Функція charAt залежить від того, як індекс перетворюється на число в специфікації .


Також 'hello'[undefined] // undefinedі'hello'.charAt(undefined) //h
Хуан Мендес

3
nullпрацює як undefined, але дивіться це: "hello"["00"] // undefinedале "hello".charAt("00") // "h"і"hello"["0"] // "h"
panzi

11
Це відверто переконує мене продовжувати користуватися [].
Наближення

Це також означає, що .charAt()виконує додаткове перетворення свого параметра в a Number. FYI, в даний час майже немає різниці в продуктивності.
Константин Ван

7
Ця відповідь повинна рухатися вгору, вона фактично пояснює, що між двома методами є різниця. Інші відповіді говорять про сумісність для IE7 (я маю на увазі насправді?), В той час як ця відповідь пояснює дуже реальну проблему.
Штурм Мюллер

11

String.charAt () - оригінальний стандарт і працює у всіх браузерах. У IE 8+ та інших браузерах ви можете використовувати позначення дужок для доступу до символів, але IE 7 і нижче не підтримують його.

Якщо хтось дійсно хоче використовувати позначення дужок в IE 7, розумно перетворити рядок у масив, str.split('')а потім використовувати його як масив, сумісний з будь-яким браузером.

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

5
IE підтримує позначення дужок від 8 і далі.
mrec

3
Цей спосіб порушується при роботі з Unicode: mathiasbynens.be/notes/javascript-unicode
Jeremy J Starcher

Цей метод був би неефективним при роботі з дійсно великими рядками, оскільки він дублює дані в пам'яті (оригінальна рядок і масив).
Даніель


5

Існує різниця, коли ви намагаєтеся отримати доступ до індексу, який знаходиться поза межами чи не є цілим числом.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.