자바 스크립트 객체에 대한 혼란스러운 점을 이해하려고합니다. 특히, 무엇이 객체 참조가 중단되는지 확인하는 데 관심이 있습니다.자바 스크립트 객체 참조가 초기 객체 값을 변경 한 후 깨집니다.
이 현상을 설명하기 위해 Chrome의 JavaScript 콘솔에서 출력물의 사본을 포함 시켰습니다. 여기서 배열을 다루고 있지만, JS의 배열과 객체 사이의 미묘한 차이를 고려할 때 객체가 유사하게 동작 할 것으로 기대합니다. 나는 명확성을 위해 코멘트를 추가했다. 위에서 보듯
// Set x to some array literal
> x = [1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
// Set y to x
> y = x
[1, 2, 3, 4, 5]
> x
[1, 2, 3, 4, 5] // as expected
> y
[1, 2, 3, 4, 5] // as expected
모두 x
y
출력과 기대 값. 이제 x의 값을 shuffle
(이 질문의 맨 아래에 지정)이라는 함수를 사용하여 섞습니다.
// Shuffle x
> x = shuffle(x)
[5, 1, 4, 2, 3]
> x
[5, 1, 4, 2, 3] // x changes as expected
> y
[5, 1, 4, 2, 3] // y changes as expected
다시 위에서 모든 것이 예상대로 작동합니다. x
및 y
변수는 동일한 객체에 대한 참조를 유지합니다. 그러나이 작업을 반복하면 결과가 이상합니다.
// Shuffle x
> x = shuffle(x)
[3, 1, 5, 4, 2]
> x
[3, 1, 5, 4, 2] // x changes as expected
> y
[5, 1, 4, 2, 3] // y didn't change this time
다음은 셔플 기능입니다 (here에서 수정). 그 목적은 배열의 내용을 섞고 (매개 변수 r1
) 혼합 배열의 첫 번째 n
항목을 반환하는 것입니다.
function shuffle(r1,n) {
var i = r1.length, j, tempi, tempj, r2;
r2 = r1;
while (--i) {
j = Math.floor(Math.random() * (i + 1));
tempi = r2[i];
tempj = r2[j];
r2[i] = tempj;
r2[j] = tempi;
}
return r2.slice(0,n);
}
this function에 따라 내 셔플 기능을 다시 작성하여 문제를 해결 이후이 있습니다. 그러나, 나는 아직도 무슨 일이 일어나고 있는지 알고 싶다. 실행중인 코드를 간단히 살펴보기 위해 jsFiddle을 만들었습니다.
아이디어가 있으십니까? 시간 내 주셔서 감사합니다.
수정 된 바이올린을 제공해 주셔서 감사합니다. – chrisfargen
@chrisfargen 안녕하세요. – Paulpro