2011-05-09 14 views

Odpowiedz

194
// Bracket Notation 
"Test String1"[6] 

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

To jest zły pomysł, aby użyć nawiasów, z tych powodów (Source):

Ten zapis nie działa w IE7. Pierwszy fragment kodu zwróci niezdefiniowany w IE7. Jeśli zdarzy ci się użyć notacji Uchwyt do strun wszystkie nad kodem i chcesz migrować do .charAt(pos), to jest prawdziwy ból: Wsporniki są używane na całym kodzie i nie ma łatwy sposób wykryć, czy który jest dla łańcucha lub macierzy/obiektu .

Nie można ustawić postaci za pomocą tej notacji. Jakkolwiek nie ma żadnego ostrzeżenia przed jakimkolwiek typem, jest to naprawdę mylące i frustrujące. Jeśli używałeś funkcji .charAt(pos), nie byłbyś skłonny do tego.

Zasadniczo jest to notacja skrótu, która nie jest w pełni zaimplementowana we wszystkich przeglądarkach.

Uwaga: nie można pisać znaków za pomocą żadnej z metod. Jednak funkcja ta jest nieco łatwiejsza do zrozumienia dzięki funkcji .charAt(), która w większości języków jest funkcją tylko do odczytu.

+6

To prawda, że ​​notacja nie działa w IE7, ale obecnie nie jest to wielką wadą. W międzyczasie testy porównawcze wykazały trzykrotny spadek wydajności podczas korzystania z funkcji charAt i indeksowania w przeglądarce Chrome, gdy ciąg znaków jest umieszczony w ramce obiektu. Wiem, że to nie jest istotne, ale wciąż warte zauważenia.https: //jsfiddle.net/mdasxxd2/ –

+4

Bardziej dokładny test (benchmark.js) https://esbench.com/bench/579609a0db965b9a00965b9e – NoNameProvided

69

Od MDN:

Istnieją dwa sposoby uzyskania dostępu do indywidualnego charakteru w ciąg. Pierwszym z nich jest metoda charAt:

return 'cat'.charAt(1); // returns "a" 

Innym sposobem jest traktowanie ciąg jako matrycy, gdzie każdy wskaźnik odpowiada pojedynczej postaci:

return 'cat'[1]; // returns "a" 

Drugi sposób (leczenie łańcuch jako tablica) nie jest częścią ECMAScript 3; jest to funkcja JavaScript i ECMAScript 5 (i nie jest obsługiwana we wszystkich przeglądarkach).

W obu przypadkach próba ustawienia pojedynczego znaku nie będzie działać. Próba ustawienia znaku za pomocą znaku charAt powoduje błąd, natomiast próba ustawienia znaku za pomocą indeksowania nie powoduje błędu, ale sam ciąg znaków pozostaje niezmieniony.

Tak więc, jak można się domyślić, teraz, charAt() jest lepszy z punktu widzenia zgodności.

+10

To prawda, ECMA 5 nie jest jest jednak obsługiwany we wszystkich przeglądarkach, ale jest obsługiwany przez większość przeglądarek: znaczy IE9 i wyżej oraz wszystkie wersje Chrome/Firefox: http://kangax.github.io/compat-table/es5/#Property_access_on_strings Brak funkcji JS będzie w 100% wspierany i wydaje mi się, że unikanie użycia funkcji ECMA 5 pozostawi nas w przeszłości na zawsze ... –

10

String.charAt() to standard i działa we wszystkich przeglądarkach. W przeglądarkach innych niż IE można używać notacji nawiasów, aby uzyskać dostęp do znaków, ale IE jej nie obsługuje. (Nie jestem pewien, czy zaimplementował to w najnowszych wersjach).

Jeśli ktoś naprawdę chce używać notacji nawiasów. Rozsądnie jest przekonwertować ciąg na tablicę znaków, aby była zgodna z każdą przeglądarką.

var testString = "Hello"; 
var charArr = myString.split(''); 
+5

IE obsługuje notację nawiasów od 8 do. – mrec

+3

Ta metoda jest niezgodna z Unicode: http://mathiasbynens.be/notes/javascript-unicode –

+0

Ta metoda byłaby nieskuteczna w przypadku naprawdę dużych ciągów, ponieważ powodowałaby duplikowanie danych w pamięci (oryginalny ciąg i tablica) . – Daniel

54

mogą dać różne wyniki w przypadku krawędzi.

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

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

Funkcja charAt zależy jak indeks jest konwertowany na liczbę w spec.

+0

Także ''hello' [niezdefiniowane] // undefined' oraz' 'hello'.charAt (undefined) // h' –

+2

'null' działa jak' undefined', ale zobacz: '" hello "[" 00 "] // undefined' ale '" hello ".charAt (" 00 ") //" h "' i '" hello "[" 0 "] //" h "' – panzi

+3

To z całego serca przekonuje mnie do dalszego używania '[]' . – ApproachingDarknessFish