string.charAt (x) 또는 string [x]?


답변:


243

대괄호 표기법은 이제 IE7 이하를 제외한 모든 주요 브라우저에서 작동합니다.

// Bracket Notation
"Test String1"[6]

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

다음과 같은 이유로 대괄호를 사용하는 것은 좋지 않은 생각이었습니다 ( Source ).

이 표기법은 IE7에서 작동하지 않습니다. 첫 번째 코드 스 니펫은 IE7에서 정의되지 않은 상태로 반환됩니다. 코드 전체에서 문자열에 대괄호 표기법을 사용하고 마이그레이션하려는 .charAt(pos)경우 실제로 고통입니다. 대괄호는 코드 전체에서 사용되며 문자열 또는 배열에 대한 것인지 여부를 쉽게 찾을 수있는 방법은 없습니다. 목적.

이 표기법을 사용하여 문자를 설정할 수 없습니다. 어떤 종류의 경고도 없기 때문에 이것은 실제로 혼란스럽고 실망 스럽습니다. 이 .charAt(pos)기능 을 사용하고 있다면 그 유혹을받지 않았을 것입니다.


21
사실 IE7에서는이 표기법이 작동하지 않지만 요즘에는 큰 단점이 아닙니다. 한편, 벤치 마크는 문자열이 객체에 박스로 묶여있을 때 Chrome에서 charAt vs indexer를 사용할 때 성능이 3 배 감소한 것으로 나타났습니다. 나는 그것이 실제로 관련이 없지만 여전히 주목할 가치가 있음을 알고 있습니다. jsfiddle.net/mdasxxd2
사이드 라이트 Zackwehdex

5
보다 정확한 테스트 (benchmark.js) esbench.com/bench/579609a0db965b9a00965b9e
NoNameProvided

3
가장 높은 점수를 받았음에도 불구 하고이 답변은 현재 (2019) 상당히 오래되었습니다. MDN인용하는 아래의 답변 을 대신 참조해야합니다.
Scott Martin

97

에서 MDN :

문자열에서 개별 문자에 액세스하는 두 가지 방법이 있습니다. 첫 번째는 charAtECMAScript 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
이것은 진심으로 계속 사용하도록 설득합니다 [].
ApproachingDarknessFish

이는 또한 .charAt()해당 매개 변수에 대한 추가 변환을 수행함 을 의미합니다 Number. 참고로 요즘에는 성능 차이가 거의 없습니다.
Константин Ван

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
이 방법은 유니 코드를 다룰 때 중단됩니다 : mathiasbynens.be/notes/javascript-unicode
Jeremy J Starcher

이 방법은 실제로 큰 문자열을 처리 할 때 메모리의 데이터 (원본 문자열 및 배열)를 복제하므로 비효율적입니다.
다니엘


5

범위를 벗어나거나 정수가 아닌 인덱스에 액세스하려고 할 때 차이가 있습니다.

string[x]if 가 0과 사이의 정수인 경우 xth 위치 의 문자를 반환 하고 , 그렇지 않으면를 반환 합니다.stringxstring.length-1undefined

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 문자열이 변경 불가능 하기 때문 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.