数组Slice()在函数内的行为不同

时间:2019-02-11 20:55:22

标签: javascript arrays slice

我正在为线性代数程序处理浮点数的矩阵(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循环复制数组没什么大不了的,但是我想理解正确。

为什么会这样?

0 个答案:

没有答案