我正在为线性代数程序处理浮点数的矩阵(2D数组)和向量(1D数组)。
几个JavaScript资源(包括SO上的线程)表明array.slice()是一种将一个数组复制到另一个数组的快速便捷的方法。一切都按预期进行-直到将slice方法用于传递到函数的数组上为止。在这种情况下,程序执行返回主例程后,数组值未已更改;这些值与将数组传递给函数时的值相同。 AFAIK,数组和对象通过引用传递到函数中,因此在函数中对其进行的更改应在返回时保留。而且数组包含基元,因此没有使事物复杂化的深层次属性。
这里有两个小代码段来说明我的意思。
// Test 1 -- All Operations Done in Main program
var i;
var orig_array = [1.5, 2.5, 3.5];
var new_array = [];
new_array = orig_array.slice(); // Copy original array into new array
for (i = 0; i < 3; ++i) new_array[i] *= 2.0; // Multiply values of new array by 2
orig_array =new_array.slice(); // Copy new array back into original array
// orig_array now contains [3.0, 5.0, 7.0]
在这种情况下,原始数组的值已按预期全部翻了一番。
但是,如果在函数中执行相同的操作,则不是这种情况。
// Test 2 -- Operations Done in Function
function test_function(work_array){
var i;
var test_array = [];
test_Array = work_array.slice();
for (i = 0; i < 3; ++i) test_array[i] *= 2.0; // Multiply values of test array by 2
work_array = test_array.slice(); // Update values of array input to function
// At this point, work_array contains [3.0, 5.0, 7.0] as expected
}
// Main program
var orig_array = [1.5, 2.5, 3.5];
test_function(orig_array);
// At this point, orig_array still contains its original values: [1.5, 2.5, 3.5]
// Changes made in function are not transferred out to main program.
我没有遇到的任何资源都在谈论这种行为。我是否误解了如何以及何时使用切片?使用for循环复制数组没什么大不了的,但是我想理解正确。
为什么会这样?