2012-03-18 3 views
1

이것은 프로그래밍 생활에서 내가 만난 가장 이상한 것입니다.배열을 비우는 것은 자바 스크립트에서 작동하지 않습니다.

self.walls = new Array(); 
self.walls = []; 
console.log(self.walls); //Doesn't print an empty array, but an array that contains something 

어떻게 가능합니까? 나는 두 가지 방법으로 빈 배열에 self.walls을 설정하고, 여전히 개체로 가득차 있습니다! 최신 버전의 Google 크롬을 사용하고 있습니다.

편집 : 또한 전체 스크립트에서 console.log()입니다.

답변

3

console.log은 호출시 개체의 상태를 저장하지 않습니다.
나중에 콘솔에 표시된 self.walls 속성을 덮어 씁니다. 당신이 실행시에 실제 상태를 기록하려면

, 당신은 객체를 직렬화 할 수 있습니다

// Works for primitives only: 
console.log(JSON.parse(JSON.stringify(self.walls))); 

// When the array contains another object, the shown referenced object might 
// change 
console.log(self.walls.concat()); // Or any other array-copying method. 
+0

매우 이상합니다. 왜 그래야만하지? 따라서 프로그램 실행을 일시 중지하지 않습니까? – corazza

+2

구현에 따라 다릅니다. 'console.log'는 문자열 인자를 받아서 콘솔에 문자열을 출력하기로되어 있습니다. –

+0

@Bane 실행을 일시 중지하지 않습니다. 배열의 실제 상태를 인쇄하는 두 가지 방법을 추가했습니다. 실행을 일시 중지하려면 ['debugger;'] (https://developer.mozilla.org/en/JavaScript/Reference/Statements/debugger) 문을 추가하십시오. –

0

가 배열하는 length을 가지고이 같은 map, shift, unshift, pop 등의 방법이있다, push 등이 있으며 배열의 속성이기 때문에 콘솔에 표시됩니다.

0, 1 또는 다른 숫자로 된 속성이없는 것으로 보입니다. 맞습니까? 만약 당신이 무엇이든 정의했다면 그것들은 실제 배열 요소가 될 것입니다.

+0

예, 요소가 있습니다. 사실 그들 중 한 톤. 또한, 이것은 실제로 대답이 아닙니다 ... – corazza

+0

그것은 당신이보고있는 것을 설명합니다. 스크린 샷이 도움이 될 수 있지만 숫자 키가있는 요소는 표시되지 않아야합니다. –

+0

위의 @ Rob의 대답을보세요. 그는'console.log'가 실행을 일시 중지하지 않기 때문에 실제로 요소를보고 있습니다. –

0

Rob W explained으로 표시된 경우 console에는 배열을 실제로 호출 할 때 해당 배열이 표시되지 않는 경우가 있습니다.

그러나 배열하지만 코드 ...

self.walls = new Array(); 
self.walls = []; 

을 ... 비우는 언급 한 배열을 비우는 하지입니다. 그것은 새로운 빈 배열을 속성에 지정합니다. 배열을 비우려면 다음을 사용할 수 있습니다.

self.walls.length = 0; 
+0

차이가 있습니까? – corazza

+0

@Bane 다릅니다. 해당 배열에 대한 다른 참조가 있습니까? 그렇다면 배열은 GC가 될 수 없습니다. – alex

관련 문제