Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改JavaScript函数中的数组会更改函数外部的数组吗?_Javascript_Arrays_Object - Fatal编程技术网

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

更改JavaScript函数中的数组会更改函数外部的数组吗?,javascript,arrays,object,Javascript,Arrays,Object,为什么这两个脚本的行为不同?我希望使用第一个脚本,但在第二个脚本中,调用它changesdata;这很奇怪,不是我想发生的。第二个脚本没有这个问题。为什么会这样,我如何修复第一个脚本 第一个脚本不会更改数据: var数据=[“右”]; 函数drawData(arrs,类型){ 如果(类型=“百分比”){ arrs[0]=“omg”; } console.log(数据[0]);//已更改!? } 绘图数据(数据); 提取数据(数据,“百分比”)第一个变量修改作为参数传递给函数的对象(它恰好是数组

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

第一个脚本不会更改数据:

var数据=[“右”];
函数drawData(arrs,类型){
如果(类型=“百分比”){
arrs[0]=“omg”;
}
console.log(数据[0]);//已更改!?
}
绘图数据(数据);

提取数据(数据,“百分比”)第一个变量修改作为参数传递给函数的对象(它恰好是数组)——所以这种变化在函数外部可见。第二个变量将新值赋给函数参数(该参数恰好是对数组的引用),但不更改数组本身

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

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

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

arrs = [1234];

它不会影响
数据
<代码>数据
只有在分配给
arrs
的属性/索引而不直接分配给
arrs
时才会受到影响。

这是因为对象本身就是对象。修改对象时,将修改该对象。当值(对象)传递给函数时,它不会被复制、克隆或复制(内部使用了不同的技术,但这在语义上是正确的)。也就是说,只有一个数组——而同一个数组在函数内部被更改。如果您希望能够在不担心影响外部环境的情况下进行更改,请先复制一份。对于一个简单的数组,这可以通过
array.prototype.slice
完成。另外,像jQuery这样的库有方便的复制方法。哦,回答者,在你说“通过引用传递”之前,请阅读并在中搜索“引用”,并能够备份你的单词选择。谢谢谢谢,我发现了一些有趣的东西,请看John Resig的回答。对于这个问题,回答太不清楚/晦涩,并且使用了定义不清的术语:“对这个数组的更改引用”?它还混合了作用域(局部变量的赋值)和对象的可变性(对象上属性的赋值)。