2012-03-02 2 views
31

아래의 예제에서 array2.length는 10입니다. 내 생각에 13이되어야합니다. "문자열 키순"인덱스가 배열의 길이를 늘리지 않는 이유는 무엇입니까? 내가 물건을 저장할 수 있으며, 여전히 그것을 액세스하고 VS 디버거는 그 배열이 제대로 저장되고 있다는 것을 보여줍니다. 그러면 길이가 왜 증가하지 않습니까?자바 스크립트 배열의 문자열 인덱스가 길이를 늘리지 않는 이유는 무엇입니까?

var array2 = new Array(); 
array2["a"] = new Array(); 
array2["b"] = new Array(); 
array2["c"] = new Array(); 
for (var i = 0; i < 10; ++i) 
    array2[i] = new Array(); 

var nothing = ""; 
for (var i = 0; i < array2.length; ++i) 
    nothing = ""; 
+0

가능한 복제 http://stackoverflow.com/questions/5223/length-of-javascript-associative-array – scibuff

답변

72

자바 스크립트 배열에는 "문자열 색인"을 사용할 수 없습니다. Javascript Array은 숫자로만 인덱싱됩니다. "문자열 인덱스"를 설정하면 객체의 속성을 설정하게됩니다. 이들은 다음과 같습니다.

array.a = 'foo'; 
array['a'] = 'foo'; 

이러한 속성은 배열의 "데이터 저장소"의 일부가 아닙니다. ,

// numerically indexed Array 
var array = ['foo', 'bar', 'baz']; 

// associative Object 
var dict = { foo : 42, bar : 'baz' }; 
+5

글쎄, 공정하기 위해서 숫자 인덱스는 단지 객체의 속성 일뿐입니다. 배열은 숫자를 사용하는 대신 인덱스의 문자열 표현을 사용하면 잘 작동합니다 :'var xs = [10, 20, 30]; console.log (xs [ '1']);' – hugomg

+3

글쎄, 자바 스크립트의 거의 모든 것이 객체라는 사실로 돌아 간다. 함수는 객체이고'.' 표기법과'[]'표기법이다. 객체 속성에 액세스하는 것은 모두 실제로 동일합니다. 여전히,'Array' 객체에 "문자열 색인"을 설정하는 것은'Array' 객체의 배열 특성을 사용하지 않습니다. – deceze

+0

배열과 객체는 같지만 차이점은 배열과 함께 얻는 프로토 타입 메소드가 객체와 같지 않다는 것입니다. 우리는 단순히 'push', 'unshift'등과 같은 메소드를 객체와 함께 사용하지 않습니다. – shubhamkes

7

항목을 배열에 추가하지 않습니다. Array 개체에 속성을 추가하고 있습니다.

2

"문자열 키 입력"색인은 색인이 아니지만 특성입니다. array2["a"]array2.a과 같습니다. 자바 스크립트에서 모든 종류의 변수에 대한 속성을 설정할 수 있다는 것을 기억하십시오. 여기서 정확히 수행하고있는 것입니다.

+0

'null', 'undefined'에 속성을 설정할 수 없습니다 : P. 또한 일부 악의적 인 IE 브라우저 개체는 사용자가 자신의 속성을 설정하거나 가져올 수 없도록합니다. – hugomg

10

길이가 defined to be1이고 배열의 가장 큰 숫자 인덱스가 더하기 때문입니다.

var xs = []; 
xs[10] = 17; 
console.log(xs.length); //11 

이러한 이유로, 당신은 당신이 키와 같은 문자열을 사용하려면 대신하는 경우 일반 객체를 사용하여 숫자 색인 일을 저장하는 배열을 사용합니다. 또한, 참고로 new Arraynew Object 대신 [] 또는 {}과 같은 리터럴을 사용하는 것이 좋습니다.

1

으로 위에서 말했다 : 어쩌면 간단한 시각화는 문자 표기 대신 new Array을 사용

var obj = {}; 
obj['a'] = 'foo'; 

: 당신은 "연관 배열"을 원하는 경우

, 당신은 객체를 사용할 필요가 연관 배열에 객체를 사용하십시오.

당신이 순수 배열 인덱스로 "길이"를 사용 할 때까지 당신은 반드시 당신이 잘못하고있는 통지하지 않습니다하지 않는 경우 :

var myArray = []; 
myArray["foo"] = "bar"; //works 
console.log(myArray["foo"]) //print "bar" 
myArray["length"] = "baz" //crash with a "RangeError: Invalid array length" 

당신이 length 속성을 대체하고 있기 때문이다 무효 인 String를 가지는 배열의

관련 문제