javascript - 为什么我的函数在修改数组时会更改参数?

标签 javascript

我不希望 foo 在这个例子中发生任何改变,但是当我在函数中将其修改为数组时,它会更改参数。注意 foo 没有被 function1 改变...我猜是因为它没有直接修改参数???任何避免这种情况的帮助将不胜感激。

http://jsfiddle.net/t47kD/

var foo = [1,2,3];

bar = function1(foo);
bar = function2(foo);
bar = function3(foo);


function function1(newFoo){
    newFoo = [newFoo,'a',1];
    return newFoo;
} //foo after function1 = 1,2,3


function function2(newFoo){
    newFoo[0] = 'a';
    return newFoo;
} //foo after function2 = a,2,3


function function3(newFoo){
    newFoo.push('4');
    return newFoo;
} //foo after function3 = a,2,3,4

最佳答案

对象(包括数组)在 ECMAScript 中通过引用分配。因此,当您修改函数中的数组时,您修改的是传递给函数的同一个数组,而不是数组的新副本。

执行数组浅拷贝的快速方法是使用 slice(0) (在某些现代引擎中,您可以省略 0)。请参阅this answer关于复制数组。

另请参阅this answer举一些例子。

关于javascript - 为什么我的函数在修改数组时会更改参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21119222/

相关文章:

用于重新分配元素 ID 的 javascript 数组循环

javascript - 当输入不为空时设置复选框被选中

javascript - ng-click 中复选框返回 false 而不是 true

JavaScript/Backbone.js 布局管理器

javascript - 为什么即使调用 evt.preventDefault();,更改 JavaScript 中的内部 html 也会导致默认操作?

javascript - Java 通过下载对话框从 url 下载文件

javascript - React Router 1.0 - 替换 # 并去掉 ?_k

javascript - webpack中的多个动态入口脚本?

javascript - 尽管给出了字段输入,但 Postman 上的验证错误

javascript - 即使输入是字符串,获取也没有方法 'writefile'?