在JavaScript函数中更改数组会更改函数外的数组吗?

时间:2012-06-12 04:43:37

标签: javascript arrays object

为什么这两个脚本的行为不同?我希望使用第一个脚本,但在第二个drawData()调用中,它会更改data;这很奇怪而不是我想要发生的事情。第二个脚本没有这个问题。为什么会这样,我该如何修复第一个脚本?

第一个脚本不会更改data

var data = ["right"];

function drawData(arrs, type) {
    if (type == "percentage") {
        arrs[0] = "omg";
    }
    alert(data[0]); // Changed!?
}
drawData(data);
drawData(data, "percentage");

第二个脚本:

var data = "right";

function drawData(arrs, type) {
    if (type == "percentage") {
        arrs = "omg";
    }
    alert(data); // OK, not changed.
}
drawData(data);
drawData(data, "percentage");

2 个答案:

答案 0 :(得分:1)

第一个变体将作为参数传递的对象修改为函数(恰好是数组) - 因此在函数外部可以看到此更改。第二个变量为函数参数赋值新值(恰好是对数组的引用),但不会更改数组本身。

答案 1 :(得分:0)

这是对局部变量的赋值与给定对象的变异之间的区别。

在两段代码arrs中都是一个局部变量,与data不同。但元素arrs的其他属性与data的属性完全相同。无论您是通过arrs还是通过data访问它们,都可以看到对这些属性值(通常称为对象/数组的变异)进行更改。这正是第一个脚本所做的。

然而,第二个脚本不会更改arrs的属性值,而是为arrs分配一个全新的值,因此现在它不再与{{1}共享任何属性}。这一点更加明显,因为datadata都是原始值,不能像前一段中所解释的那样发生变异。但即使它们是对象或数组,您也可以执行以下任务:

arrs

不会影响arrs = [1234]; 。只有在未指定data的情况下分配给data的属性/索引时,arrs才会受到影响。