아주 간단한 예 :
var a = { id: 5 };
var b = { id: 6 };
var c = { id: 7 };
var arr = [a, b, c];
이제 기능이 있습니다.
function remove(startIndex) {
// set objects to null from startIndex in array
}
내가 이것을 시도하면 :
arr[0] = null;
그런 다음 나는 :
arr[0] == null // true
a == null // false (i need true)
그래서, 내 질문에, 객체에 액세스하면 컬렉션 (배열 또는 객체)을 던지고 변경할 수 있습니까?
다음과 같이 쓰고 싶지 않습니다.
function remove(startIndex) {
if(startIndex == 0) {
a = null;
b = null;
c = null;
}
if(startIndex == 1) {
b = null;
c = null;
}
if(startIndex == 2) {
c = null;
}
}
다음과 같이 작성하기가 훨씬 쉽습니다 (그러나 작동하지 않습니다).
function remove(startIndex) {
for(var i = startIndex; i<arr.length; i++) arr[i] = null;
}
작성중인이 코드로 무엇을 목표로하는지 정확히 모르겠지만 Javascript 작동 방식은 다음과 같습니다.
값으로 변수를 인스턴스화 할 때마다 { id: 10 }
. 그 객체는 메모리에 저장되고 참조 는 변수로 다시 반환됩니다 a
.
이제라고 말하면 var b = a;
동일한 참조가 이제 variable에 전달됩니다 b
. 이제 Javascript 런타임은 객체를 참조하는 두 개의 변수가 있음을 알고 있습니다 { id: 10 }
.
이제 더 이상 변수를 유지하고 싶지 b
않으므로 작성 b = null;
합니다. 객체가 삭제되었다고 생각하지만 자바 스크립트 런타임은 객체 { id: 10 }
에 하나의 참조 (즉, 변수) 가 있음을 알고 a
있습니다. 따라서 { id: 10 }
메모리에서 제거되지 않습니다 .
당신은 또한 다음과 같이 작성할 경우, a = null;
다음, 거기에 제로 참조하고, 자바 런타임의 가비지 콜렉터는 결국 메모리에서 개체를 제거하기 얻을 것이다.
이 모든 것은 더 이상의 관리 없이는 원하는 것을 달성 할 수 없다는 것을 이해하게하는 것입니다.
당신이 정말로 원하는 경우 a, b, c
로 null
, 당신은 명시 적으로 자신의 값을 설정하는 코드 작성해야합니다 null
너무합니다. 마찬가지로 a = arr[0]; b = arr[1]; c = arr[2];
배열이 변경 될 때마다. 당신은 할 수있는 eval
문을 등 손으로 변수를 작성하고, 그 중 루프를하지에 일부 문자열 템플릿을하지만, 당신은 단지 세 개의 변수가 있다면 그게 가치가 없어.
도움이 되었기를 바랍니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다