2011-12-26 4 views
1

자바 스크립트는 문자 그대로가 아니라 참조로 객체를 복사합니다. 예를 들면 :참조로 개체를 복사하는 데 실제적인 용도가 있습니까?

var myObject = {}; 
var myCopy = myObject; 

myObject.foo = "bar"; 

alert(myCopy.foo); //alerts "bar" 

하지만 난 정말 당신이 동일한 개체에 다른 이름을 다른 용도를 줄 수있는 (코드가 약간 더 읽을 수 있도록 개발자들에게 수있는 방법을 제공하는 것보다이 다른 실용적인, 실제 이유를 생각 고군분투).

가장 중요한 것은 내가 그 요점을 놓 쳤기 때문에 아무도 그 요점은 무엇인지 말해 줄 수 있습니까?

+2

이 동작에 "copy"라는 단어를 사용하지 않겠습니다.당신은 단순히 두 변수에 동일한 객체에 대한 참조를 할당하고 있습니다. 두 변수에 5 번을 할당하는 것과 다르지 않습니다. 그런 과제를 할 수있는 언어로 무엇을 할 것인지 상상할 수 없습니다. – Pointy

답변

4

: 객체는 이름 myObject에 의해 참조 할 수 어딘가에 메모리가 밖으로

var myObject = {}; 

. 다음 할당 :

var myCopy = myObject; 

... myCopy이 지금은 어디에 있든지 같은 객체를 참조 말한다.

function somefunc(localName) { 
    // body 
} 
someFunc(myCopy); 

이제도 메모리에서 같은 객체 밖으로을 의미하는 지역 someFunc에있다 localName라는 변수가있다 : 이것은 당신이 함수에 인수를 줄 때 발생하는 같은 일이다.

이것은 서로 다른 범위에서 다른 이름으로 참조 할 수 있도록 개체에 대한 참조를 전달하는 근본적인 방법입니다.

은 메모리의 새 위치로 전체 구조를 복사 할 수 있습니다. 디자이너가 언어를 만들지 못하게하는 것은 아무것도 없었습니다. 그러나 깊이있는 중첩 된 객체를 생각하면 덜 효율적이며 일반적으로 사용자가 원하는 것은 아닙니다. 예를 들어, 함수가 객체의 한 속성을 수정 한 경우 해당 변경이 함수 외부에서 유지되도록 전체 객체를 반환해야합니다. 호출자는 이전 값을 유지해야하는지 또는 새로 생성 된 약간 다른 복사본을 덮어 쓸지 여부를 결정하여 반환 값을 처리해야합니다.

다시 말하면 원칙적으로이 디자인 방향에는 아무런 문제가 없습니다. 자바 스크립트가 설계된 방식이 아닙니다.

1

귀하의 경우 실제 목적을 달성하지 못하기 때문에 다소 혼란 스러울 수 있습니다.

var style = document.getElementById("foo").style; 

style.color = "red"; 
style.font = "sans-serif"; 
// ... 
0

내 의견 (:이 같은 예에서와 같이, 객체를 사용하는 각 문에 대한 낮은 입력을 필요로하기 때문에, 객체에 이상 경로 것이, 별도의 변수에 객체를 저장하는 것이 유리할 수있다 그리고 그것은 아무것도 아닌 것입니다.) 복사보다는 참조로 객체를 만드는 것이 일반적으로 더 유용하고 사용자가 원하는 것입니다. 메서드에 매개 변수로 객체를 전달하면 복사 작업 (원본은 그대로 유지)보다는 해당 메서드에서 작업하고 변경 한 객체에 (거의 항상) 관심을 갖게됩니다. 분명히 이것이 사실이 아니고 선택할 수있는 옵션이있는 것이 좋을 수도 있지만, 객체 복사본을 메서드에 전달할 수 있으면 좋겠다는 생각을 결코 잊지 못할 수 있습니다. 대개 매우 감사합니다. 내가하고있는 일이 문제 야. 작성 후

관련 문제