2013-04-24 4 views
2

그래서, this post here명은 자바 스크립트에서 전역 변수를 올바르게 재설정 하시겠습니까?

A = [1,2,3]; 

다음
A = []; 

배열을 다시 있지만 새로 만들어지지 않습니다하고 있다는 사실을 논의하고있다.

내 질문은 내가 전역 개체 변수를 사용하는 경우

myglobals = { A : [] } 

내가 안전하게

myglobals.A = []; 

오른쪽

와 배열을 재설정 할 수 있습니다,
입니까? 그것은 동일한 객체 속성을 참조하므로 실제로 새 배열을 만들지 않습니다. splice(0) 갈 방법이며, 매우 비슷한 질문 때문에 메모리를 확보 브라우저에 미치는 영향을 설명하는 답을 가지고 일반적인 합의가 있기 때문에

업데이트로 인해

아래 발언에 의문을 제기하는 나는 그것의 참조을 유지하면서 그것의 을 재설정하기 위해 null으로 어떤 정의 된 객체 (배열 또는 함수 또는 문자열 등이든)를 설정하는 것이 일반적으로 안전하고 적절한 지 궁금합니다.

+1

객체는 아직 프로토 타입을 가질 수있다, 그것은해야합니다! 그게 무슨 자바 스크립트입니다. 프로토 타입의 객체, 빈 또는 아닙니다! 'null '도 무언가이기 때문에 아무것도 아니기 때문에'[]'도 무언가이지만'var A = undefined'는 정의되어 있지 않지만 A는 일부 proto/type의 객체로 존재합니다! –

+0

@ alex23, 다른 게시물을 참조 해 주셔서 감사합니다. 'myglobals.A.splice (0)'이 실제로는 최선의 방법은 아닌 것 같습니다. 브라우저는 메모리를 수집 할 수 있도록 허용 된 대답에서 'null'로 설정해야합니다. – tim

+0

@codelio, 아마 내 질문에 잘 대답하지 않아요. 그럴 경우 미안 해요. 아래의 답은 옳지 않습니다 :'A = undefined'를 설정하면'typeof (A)'는'undefined'를 반환하지만'object '를 얻을 것이라고 기대합니다. – tim

답변

5

새 배열을 만듭니다. 배열을 자르려면 길이를 0으로 설정하면됩니다.

var a = [1,2,3]; 
a.length = 0; 
// a is now [] 

예를 들어 객체 속성을 사용하는 경우는 동일합니다. JavaScript에는 포인터가 없으며 참조 값 만 있습니다. 따라서 myglobals.A 값은 배열에 대한 참조입니다. 새 배열을 할당하면 해당 값이 다른 배열에 대한 새 참조가됩니다.

+0

배열을 삭제하려면 객체의 모든 요소를 ​​제거해야합니다 ('arr.length = 0'는 실제로 배열에서 참조를 제거하지 않습니다). 배열을 합리적으로 지우는 간결한 방법은'arr. 스플 라이스 (0)'. – zzzzBov

+1

@zzzzBov 정말입니까? 왜냐하면'var a = [1,2,3]; a.length = 0; a [1]; // undefined'입니다. – bfavaretto

+0

'arr.splice (0)'은 현재의 배열 참조에 영향을 미칩니다 (아마도'arr.slice'는 비슷한 것 같습니다). 그러나 배열 항목을 지우는'a.length = 0'에 대한 것 같습니다 . 나는 단순히 배열 인스턴스에 대한 속성의 존재를 감추었을뿐입니다. – zzzzBov

2

아니요, 여전히 새로운 배열을 만듭니다. 중요한 요소는 할당이고 "A"변수가 첨부 된 범위가 아닙니다. something = []과 같은 것을 만들면 자바 스크립트 엔진은 새로운 Array 객체 ([] 부분)를 만들고 나서 그것에 대한 참조를 something에 할당합니다.

+0

무슨 일이 일어나고 있는지에 대한 간결한 설명에 감사드립니다. – tim

2

별로 ...

// make a global variable 
var a = [1,2,3]; 

// Assign it to something 
var someObj = { value: a }; 
someObj.value; // [1,2,3]; 

// set a new value for the global 
a = []; 
a; // [] 
someObj.value; // [1,2,3]; 

이것은 당신이 언급 초기 코드입니다. 전역 변수가 가리키는 오브젝트는 변경할 수 있지만 대체중인 오브젝트에 대한 다른 참조는 변경할 수 없습니다.

그리고 같은 문제가 두 번째 예와 함께 존재합니다

// make a global variable 
var globals = { a: [1,2,3] }; 

// Assign it to something 
var someObj = { value: globals.a }; 
someObj.value; // [1,2,3]; 

// set a new value for the global 
globals.a = []; 
globals.a; // [] 
someObj.value; // [1,2,3]; 

당신이 참조를 업데이트하려는 경우는 globals 컨테이너 객체를 참조해야합니다. 다른 객체가 컨테이너에 대한 참조를 보유하고있는 경우 해당 컨테이너의 내용을 변경할 수 있습니다.

// make a global variable 
var globals = { a: [1,2,3] }; 

// assign a reference to the container in another object. 
var someObj = { globals: globals }; 
someObj.globals.a; // [1,2,3]; 

// set a new value for the global 
globals.a = []; 
globals.a; // [] 
someObj.globals.a; // []; 

다소 다루기 힘든 생각.


개체 참조를 바꾸지 않고 전역으로 변경할 수도 있습니다.

var a = [1,2,3]; 
var b = a; // a and b now reference the same object. 

a.splice(0); // remove all items from this array, without replace the array object. 
a; // []; 
b; // []; 
// a and b now still point to the same array, which is now empty. 
+0

끝 부분에는'a.splice (0)'이어야한다고 생각합니다. – zzzzBov

+0

@zzzzBov Derp ... 감사합니다! –

1
var A=[1,2,3]; 
A=undefined; 
console.log(A); //undefined 
+0

글쎄, 그냥 배열을 아무것도 바꾸지 않고'array' 타입의 변수로 리셋하지 않았습니다. A = undefined; A = [];'두 문을 수행 할 수있는 방법이라고 생각하지만 A 할당을 확실히 제거합니까? 아니면 새로운 참조를 추가합니까? A = null이면 어떨까요? – tim

+0

변수를 무시하면 잘 작동합니다. A.length = 0은 언제나 작동하지 않습니다. A.의 유형에 따라 달라집니다. 즉, 어떤 종류의 프로토 타입이 만들어 졌는지에 달려 있습니다. 낮은 수준의 타입으로 오버라이드하면 항상 그 안에있는 모든 것을 비울 것입니다. 특별히 타입을 변경할 때,'null'과'undefined'는 무엇을할까요? –

+0

다른 말로하면 변수가 주어지면 범위가 있습니다! 그것이 어딘가에 속한다. 그러나 그것이 속한 것이 변경되거나 덮어 쓰여지면 javascript는 새로운 것의 공간입니다. 그것은 var A를 쓰는 것과 같지만 아무것도 아니지만 정의되지 않았습니다! 이런 종류의 타이핑에서는 –

1
왜 삭제 언젠가 더
var handle={}; 
handle.A=[1,2,3,4,5,{x:2,y:3}]; 
console.log(handle); 

what is given now

delete handle.A; 
console.log(handle); //A is gone! 

after deleting A from handle

? Ahandle에서 실제로 죽이면 .length이 진실을 말하면 큰 물체로 작업하는 것을 혼란스럽게 할 수 있습니다. 내가 그것을 =10 및 스크립트가 잘못된 가정 수 설정 때문에

handle.A=[null]; 
handle.B=undefined; 
handle.C=null; 
handle.A.length=10; 
console.log(handle, handle.length, handle.A.length); 

매우 뭔가 (10 개) 요소를 통해 루프에있다, 코딩에 저장할 수 없습니다. 이렇게 handle.A=null는 도울 것이다, 그러나 진짜로 당신의 목표의 구조를 바꾸지 않을 것이다. var A 같은 것을 가지고 있기 때문에 스크립트를 중단 할 수 없으므로 기존 요소가없는 루프를 방지 할 수 있습니다. undefined에 세트 같은 작품 자체 아래 ..

so be carefull

+0

을 사용하면 A –

관련 문제