2010-04-23 2 views

답변

2

변수, 참조 및 개체가 혼합되어 있습니다.

Doing delete y;은 변수 y를 제거합니다. 변수는 더 이상 존재하지 않으므로 더 이상 값을 갖지 않습니다. 따라서 변수에 포함 된 참조가 없어졌습니다.

그러나 변수를 제거해도 참조하는 개체가 제거되지는 않습니다. 배열에는 여전히 객체에 대한 참조가 포함되어 있으며 변수의 존재 여부에 의존하지도 않습니다.

실제로 개체를 직접 제거 할 수있는 방법은 없습니다. 당신은 객체에 대한 모든 참조를 파괴함으로써 객체를 제거합니다. 개체가 참조를 제거하도록하고 싶습니다. 단순히 참조의 참조가 작동하는 방식이 아닙니다.

+0

객체의 이벤트에서 객체에 대한 참조를 제거 할 수 있다면 충분할 것입니다. 개체에 대한 참조를 어떻게 든 전달할 수 있습니까? – intacto

+0

@Guffa,'delete y'는'y'가'this.y' 일 때 전역 문맥에서만 작동합니다. 읽기 : http://perfectionkills.com/understanding-delete/ – James

+0

@intacto : 개체가 배열에서 참조를 제거 할 수있게하려면 개체는 참조를 포함하는 모든 배열에 대한 참조를 포함해야합니다 . 따라서 배열에 객체를 추가 할 때 객체에 배열을 추가해야합니다. – Guffa

0

그건 어떻게 delete 작동하지 않습니다. 동일한 객체에 대한 다른 참조가 아니라 객체 참조를 전달합니다. 당신은 여기 "약한 참조"와 같은 것을 찾고 있는데 JavaScript로 구현하는 방법을 모르고 있습니다.

0

도움이 되셨습니까?

Var x=[{}]; var y=x[0];

편집 : 미안 해요, 난 조금 응답에서 내 첫 번째 시도에서 간단한이었다. 내가 무엇을 묻기 시작할 것인가? 배열 외부에 "존재"할 필요가있는 이유는 무엇입니까? 당신은 단지 객체의 배열을 생성하고 delete 또는 array.splice()를 사용하여 필요할 때 객체를 제거 할 수 있습니까?

둘째, 배열 외부에 y가 있어야하는 경우 배열 인덱스를 참조하는 속성을 만들거나 올바른 개체 참조를 찾기 위해 배열을 검색 할 수있는 유틸리티 함수를 만듭니다. 제거. 다른 말로하면,

var x=[]; var y={}; y.arrayIndex=(x.push(y)-1); 

// later on, you want to get rid of y 

delete x[y.arrayIndex]; delete y; 
+0

y는 그래서 나는 이런 식으로 뭔가를 사용하지 못할 함수에 참조로 전달 개체입니다. – intacto

+0

당신은 응답 시간이 빠르다. :) 한편, 나는 내 제안을 개선하려고 노력했다. – hallvors

+0

(심지어 함수에 객체를 넘겨 주더라도 func (x [0]); - no?) – hallvors

0

이 나던 작업 : 그것은 않습니다 물론

x.push(y);

, 그것은 의도 한대로 정확히 작동합니다 - 당신이 만든 배열의 값 y를 밀어.

연산자는 특히 개체의 속성을 삭제하기위한 연산자입니다. 연산자 뒤에 나오는식이 속성으로 해석되지 않으면 전혀 발생하지 않습니다.

var y = {"someprop":true}; 

delete y; 
alert(y.someprop); // alerts "true" 

하는 브라우저 창에서 그것을 시도, 당신의 주소 표시 줄에 다음을 붙여 Enter 키를 누르십시오 :

javascript:var y = {"someprop":true}; delete y; alert(y.someprop); 
+0

감사합니다. 새로 푸시 된 요소의 인덱스를 얻을 수있는 방법이 있습니까? – intacto

+0

@intacto :'push()'는 배열의 끝 부분에 요소를 추가하고 반환 값은 새로운 길이이므로 하나의 요소 만 추가하면 인덱스는 항상'array.push (item) - 1'이됩니다. 'var index = x.push (y) - 1;' –

관련 문제