为什么这两个脚本的行为不同?我希望使用第一个脚本,但在第二个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");
答案 0 :(得分:1)
第一个变体将作为参数传递的对象修改为函数(恰好是数组) - 因此在函数外部可以看到此更改。第二个变量为函数参数赋值新值(恰好是对数组的引用),但不会更改数组本身。
答案 1 :(得分:0)
这是对局部变量的赋值与给定对象的变异之间的区别。
在两段代码arrs
中都是一个局部变量,与data
不同。但元素和arrs
的其他属性与data
的属性完全相同。无论您是通过arrs
还是通过data
访问它们,都可以看到对这些属性值(通常称为对象/数组的变异)进行更改。这正是第一个脚本所做的。
然而,第二个脚本不会更改arrs
的属性值,而是为arrs
分配一个全新的值,因此现在它不再与{{1}共享任何属性}。这一点更加明显,因为data
和data
都是原始值,不能像前一段中所解释的那样发生变异。但即使它们是对象或数组,您也可以执行以下任务:
arrs
不会影响arrs = [1234];
。只有在未指定data
的情况下分配给data
的属性/索引时,arrs
才会受到影响。