2014-06-15 2 views
0

나는 다음 설치저장된 배열의 값이 변경되는 이유는 무엇입니까?

코드

array1 = [['2001-05-01', 20], ['2001-05-02', 23], ['2001-05-03', 18]]; 

save_ar = array1; 
plotarrays2 = [array1]; 
plotarrays2.push(new_series2(array1, save_ar, 0, 1, 0.1)); 

function new_series2(origin, stated, start, end, factor) { 
    var result = [[]]; 
    console.log("before " + stated[0][1]); 
    result = stated.map(function (item, index) { 
     if (index < start || index >= end) return [item[0], 0]; 
     else return [item[0], item[1] * factor]; 
    }) 
    console.log("after " + stated[0][1]); 
    for (var i = 0; i < result.length; i++) { 
     origin[i][1] = parseInt(origin[i][1]) - result[i][1]; 
     console.log("after2 " + stated[0][1]); // why???? 
    } 
return result; 
}; 

문제

내가 after2가 이전과 이후로 같은 값을 가져야한다는 기대가있다. 하지만 어떻게 든 명시된 배열도 조작됩니다. 이전에 저장하려했으나 어쨌든 변경됩니다.

jsfiddle

http://jsfiddle.net/gcollect/amsn3/

+1

'save_ar = 배열 ​​1;'하지 않습니다 '사본'배열; 배열의 참조를 메모리에있는 배열에 대한 포인터로 지정합니다. 함수에 전달할 때와 동일합니다. 값만 전달하지 않고 참조로 * 전달합니다. 즉, 실제 배열이 하나 뿐이며 동일한 배열에 * 참조를 모두 포함하는 여러 변수가 있음을 의미합니다. –

답변

2

는 만 save_ararray1에 의해 명명 된 배열을 참조했다. 당신이하고 싶은 것은 배열과 그 내용의 복사본을 만드는 것입니다. 사용 :

save_ar = array1.map(function (item) { 
    return item.slice(0); 
}); 

대신 :

save_ar = array1; 
+0

이 맞습니다. 나는 그걸 잊어 버렸음에 틀림 없어 ... – gco

관련 문제