2014-04-06 2 views
1
this.lastLocations[0] = this.locations[0]; 
this.locations[0].x++; 

이 코드를 실행하면 위치 [0] .x와 lastLocations [0] .x가 모두 증가합니다. 위치를 바꿀뿐입니다. [0] .x. 자바 스크립트가 값보다는 레퍼런스를 할당하기 때문입니까? 아니면 다른 곳에서 코드에 문제가 있습니까?자바 스크립트 : array1 [0] = array2 [0]; 가치 또는 참고로 전달됩니까?

+0

oo. 스택 오버플로 메커니즘과 에티켓을 여전히 배우고 있습니다. – SUCHANOOB

답변

3

자바 스크립트의 객체는 참조에 의해 지정되므로 두 변수가 모두 똑같은 객체를 가리키고 있습니다. 이 수행 할 때

그래서, 그런 다음

this.lastLocations[0] = this.locations[0]; 

을 모두 this.lastLocations[0]this.locations[0] 이제 동일한 개체를 가리 킵니다. 이 변수 중 하나를 통해 해당 객체를 변경하면 다른 변수를 통해 해당 변경 사항이 표시됩니다 (둘 다 동일한 객체를 가리킴).

복사본을 할당하려면 새 개체를 만든 다음 원래 개체의 모든 속성을 새 개체로 복사하고 그 복사본을 할당해야합니다.

What is the most efficient way to deep clone an object in JavaScript?

How do I correctly clone a JavaScript object?

is it possible in Javascript to tell an object to stop having reference behavior with another object

그리고 다른 관련 질문 :

Do objects pushed into an array in javascript deep or shallow copy?

객체를 복사 복제하는 방법에 대한 수많은 다른 게시물이 /가 있습니다자바 스크립트에서

Javascript by reference vs. by value

+0

@ SUCHANOOB - 참고 자료 참조 개체 사본을 만드는 방법에 대한 내 대답에 추가했습니다. – jfriend00

0

모든 통과하고 값에 의해 할당됩니다.

"개체"는 JavaScript의 값이 아닙니다. JavaScript의 유일한 값은 프리미티브와 참조 (객체에 대한 포인터)입니다. 따라서 array1[0]은 프리미티브 또는 객체에 대한 포인터이고 array2[0]은 객체에 대한 프리미티브 또는 포인터입니다.

array1[0] = array2[0]을 지정하면 두 포인터가 같은 개체를 가리 키도록 개체 포인터가 할당됩니다.

+0

어, downvoter가 아니라 이것을 설명하는 것은 매우 혼란스러운 방법입니다. –

+0

@BenjaminGruenbaum : 설명하는 * 정확한 * 방법입니다. – newacct

+0

음 ... 공정하기 위해서, 나는 그것을 말하고 싶지 않았습니다. 그러나 그것은 정말로 정확하지 않습니다. 이 대답에는 여러 가지 용어의 부정확성이 있습니다. 객체 값, 참조 등의 용어에 대해서는 http://es5.github.io/#x8.7이라는 스펙을 실제로 참고해야합니다. 포인터는 JavaScript (참조 연산자, 참조 연산자, 포인터 산술 등)에 전혀 존재하지 않으며 JavaScript는 참조 값으로 전달됩니다. –

관련 문제