5

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

第一个脚本没有改变data

    var data = ["right"];

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

第二个脚本:

    var data = "right";

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

4

2 回答 2

2

这是分配给局部变量和给定对象的变异之间的区别。

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

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

arrs = [1234];

它不会影响data。仅当您分配给属性/索引而不直接分配给data时才会受到影响。arrsarrs

于 2018-05-19T20:26:56.773 回答
0

第一个变体修改作为参数传递给函数的对象(恰好是数组) - 所以这种变化可以在函数之外看到。第二个变体为函数参数分配新值(恰好是对数组的引用),但不改变数组本身。

于 2012-06-12T04:55:28.857 回答