2014-09-27 2 views
2

나는 이상한 일을 우연히 발견했습니다 ....이 둘 사이의 차이를 설명하는 시도 할 수 있습니다 어쩌면 사람 : 항목이 동일자바 스크립트 배열 이상시 초기화

var a1=Array(2); 
var a2=Array.apply(null,a1); 
console.log(a1); 
console.log(a2); 
console.log(a1[0]===a2[0]); 

통지하지만 배열 모양의 콘솔 로그를 다른 (Chrome 및 NodeJS에서).

또한 그들의 다른 측면은 다르게 작동하는 것 :뿐만 아니라 A1에 대한 대답을 위해 itereares지도

a1.map(function(i){console.log("!");}) 
a2.map(function(i){console.log("!");}) 

통지를.

이것은 NodeJS, Chrome 및 FF에서 발생합니다.

아이디어가 있으십니까?

var a = new Array(3) // a = [ , , ,] 

당신이 map 또는 forEach를 사용하여 반복하려고하면은, 자바 스크립트 구멍을 건너 뜁니다 : 자바 스크립트에서

+0

문서를 점검하지 않고,'a1 = Array (2)'는'a1'을 길이가 2 인 배열로 설정하지만 어떤 요소도 명시 적으로 지정하지는 않는다고 말하고 싶습니다. 'a2 = Array.apply (null, a1) '은'a2 = Array (undefined, undefined)'를 말하는 것과 비슷합니다. 즉, 명시 적으로 두 요소의 값을'undefined '로 설정합니다. '.map()'은 명시 적으로 설정된 요소만을 반복합니다. – nnnnnn

+0

즉, (이 경우에는)이 키를 추측하고있다. 두 가지 가능한 이유 때문에'someArray [someIndex]'는'undefined '를 반환 할 것이다. 1. someIndex의 요소에 결코 값이 할당되지 않았기 때문에, 또는 2. someIndex의 요소가 명시 적으로 'undefined'로 지정 되었기 때문에. 그리고 당신의'a1 [0] === a2 [0]'테스트는 이유 1을 '정의되지 않음'과 이유 2를 '정의되지 않음'으로 비교합니다. – nnnnnn

답변

4

,이 스파 스 배열을 만듭니다. 호출

var b = Array.apply(null, Array(3)) // b = [undefined, undefined, undefined] 

치밀한 배열을 생성 b (이 Array(undefined, undefined, undefined)으로 배열 생성자 호출에 상당). ba과 거의 같지만 이제는 요소를 반복 할 수 있습니다. 즉, 배열의 밀도가 높기 때문에 map 및 foreach는 요소를 건너 뛰지 않습니다.

+1

포인터에 대한 10x .... 더 자세히 살펴보면 두 경우를 구별 할 수 있다는 것을 알았습니다 : console.log (a1,0에서 a2); – srfrnk