JS 객체의 키 (문자열) 길이에 제한이 있습니까?


84

그래서 우리는 키가 id (int)이고 값이 문자열 인 객체를 갖는 경우가있었습니다. 그러나 우리는 대부분의 경우 문자열을 기준으로 id를 조회하는 것을 알아 차렸으므로이를 뒤집고 문자열을 키로 만들고 값은 id입니다. 그렇게하면 각 항목을 살펴보고 값을 비교하는 대신 var id = storage[text];. 다음은 우리가 한 일의 예입니다.

다음은 이전 구현의 예입니다.

var storage = {
  0 : null,
  1 : "Hello",
  2 : "world!",
  3 : "How are you?"
}

다음은 새로운 구현의 예입니다.

var storage = {
  "null" : 0,
  "Hello" : 1,
  "world!" : 2,
  "How are you?" : 3
}

이제 문자열이 키이고 동일한 문자열에 대해 동일한 ID를 가져도 괜찮다는 것을 이해합니다. 그러나 이제 문자열이 잠재적으로 상당히 클 수 있기 때문에 (슬림 한 기회이지만 문자열 당 최대 1KB 일 수 있음) JS 또는 Android webview가 개체 키에 적용하는 길이 제한이 있습니까?

또한이 구현에는 단점이 있습니까? 나는 지금까지 어떤 문제도 발견하지 못했지만 당신은 결코 알지 못합니다.

답변:


96

나는 이것을 조금 조사했습니다.

MDN은이 문제에 대해 침묵 하며 사양 ( ES5 , ES6 )도 마찬가지입니다 . 속성 접근자는 자격이없는 문자열이어야한다고 만 명시합니다. 즉, 사양에 관한 한 제한이 없습니다. 그것은 놀라운 일이 아닙니다.

브라우저가이를 처리하는 방법은 또 다른 문제입니다. 테스트를 설정 하고 여러 브라우저에서 실행했습니다. Chrome 40 (데스크톱), Chrome 40 (Android 5.1), Firefox 36, Opera 27 및 IE9 +는 최대 227 자의 속성 이름을 처리 할 수 ​​있습니다 . Safari 8 (OS X Yosemite)은 2 ~ 30 자의 속성 이름도 처리 할 수 ​​있습니다 .

IE를 제외한 모든 브라우저의 경우 최대 속성 길이는 최대 문자열 길이와 같습니다. IE9 + 2 ~ 최대 문자열 길이를 처리 할 수있는 30 자,하지만, 객체 키에 대한 제한은 2 개에있다 27 단지 다른 브라우저에서와 같이 문자.

테스트 코드로 인한 메모리 문제로 인해 iOS의 IE8 및 Safari에서 테스트가 작동하지 않았습니다.

요컨대, 긴 속성 이름을 사용하는 것이 안전합니다. 문자열 자체가 브라우저가 처리 할 수있는 범위 내에있는 한 속성 이름으로도 사용할 수 있습니다.


17
모든 런타임 최신 브라우저에 긴 키에 대한 처벌?
아메드 Fasih

@AhmedFasih 나는 그것을 테스트하지 않았으므로 확실히 알지 못합니다. 성능 저하가 있다면 긴 문자열 비교와 관련이 있다고 가정합니다. 실제로 중요한 문제가 있으면 놀랍습니다. 키가 크고 많지 않고 모바일에서 메모리 제약에 부딪히기 시작 하지 않는 한 .
hashchange

7
ES7 사양 은 "elements"의 2 ^ 53-1 제한을 지정 합니다 . 그러나 나는 그것이 힙 최대 크기로 제한 생각
MEMS

6
" MDN은이 문제에 대해 침묵합니다… ". 더 이상은 아닙니다 . ;-)
RobG

2
따라서 실제 크기는 2 ^ 27 = 0.125GB, 2 ^ 30 = 1GB입니다. 즉 :) 나를 위해 많은입니다
소린 C

34

아니요, 문자열 길이에는 제한이 없으며 (메모리에 맞는 한) 구현도 괜찮아 보입니다. 예를 들어 부울 값이있는 배열을 '뒤집은'배열을 갖는 것은 매우 일반적입니다. 그리고 키로서의 문자열에 관해서 : 문자열은 특정 주소에 저장되는 불변의 기호이며, 실제로 배열의 인덱스로 사용되는 것은 문자열 자체가 아닌 해당 주소 (일명 포인터라고도 함)입니다.


7
"문자열은 불변의 기호입니다.": 이것을 어디서 배웠습니까?
Andrew

4
흥미 롭군. 참조 또는 출처를 추가 할 수 있습니까?
hashchange

8
많은 언어에서 문자열은 변경할 수 없습니다. Javascript는 이러한 언어 중 하나입니다. developer.mozilla.org/en-US/docs/Web/JavaScript/…
hartz89

3
다른 사람들에게 약간의 명확성을 추가하기 위해서입니다. 이는 문자열을 변경하는 작업을 수행 할 수 없음을 의미합니다. 새 문자열을 조작하고 반환 할 수 있지만 실제로는 변경하지 마십시오
Patrick

받아 들여지는 대답이 더 실용적이지만 이것이 진정한 대답입니다.
theUtherSide 2018

5

ECMAScript 2016에서는이 질문에 대한 확실한 답이있는 것처럼 보입니다. string.lengthMDN 웹 문서에 따르면 :

ECMAScript 2016 (ed. 7)은 최대 길이 2 ^ 53-1 요소를 설정했습니다. 이전에는 최대 길이가 지정되지 않았습니다.

ECMAScript® 2016 언어 사양 에서 지정된 내용을 찾을 수도 있습니다 .

문자열 유형은 최대 길이 2 53 -1 요소 까지 0 개 이상의 16 비트 부호없는 정수 값 ( "요소")의 모든 순서가 지정된 시퀀스의 집합입니다 .

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