Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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_Slice_Shallow Copy - Fatal编程技术网

Javascript切片方法是否返回浅层副本?

Javascript切片方法是否返回浅层副本?,javascript,arrays,slice,shallow-copy,Javascript,Arrays,Slice,Shallow Copy,在一个Mozilla开发者翻译的韩文中,lang说“slice方法”返回一个新的数组,该数组是粗略复制的 所以我测试了我的代码 var animals = ['ant', 'bison', 'camel', 'duck', 'elephant']; var t = animals.slice(2,4); console.log(t); t[0] = 'aaa'; console.log(t); console.log(animals); 但是,如果slice方法返回浅数组,则动物数组应更改

在一个Mozilla开发者翻译的韩文中,lang说“slice方法”返回一个新的数组,该数组是粗略复制的

所以我测试了我的代码

var animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];

var t = animals.slice(2,4);
console.log(t);

t[0] = 'aaa';
console.log(t);
console.log(animals);
但是,如果slice方法返回浅数组,则动物数组应更改为['ant'、'bison'、'aaa'、'duck'、'elephant']


为什么是浅拷贝

字符串是JavaScript中的基本类型,因此您将获得一个包含新字符串的新数组

测试数组应该是一个对象数组:

var-animals=[{name:'ant'},{name:'bison'},{name:'camel'},{name:'duck'},{name:'elephant'}];
var t=动物切片(2,4);
控制台日志(t);
t[0]。名称='aaa';
控制台日志(t);

控制台.日志(动物)
切片
不会更改原始数组。 它返回原始数组中元素的浅层副本

原始数组的元素复制到返回的数组中,如下所示:

对于对象引用(而不是实际对象),slice将对象引用复制到新数组中。原始数组和新数组都引用同一个对象。如果参照对象发生更改,则新阵列和原始阵列都可以看到这些更改

对于字符串、数字和布尔(不是字符串、数字和布尔对象),切片将值复制到新数组中。对一个数组中的字符串、数字或布尔值的更改不会影响另一个数组。 如果将新元素添加到任一数组,则另一个数组不受影响。()

在您的例子中,数组由字符串组成,这些字符串在切片上会返回复制到数组的新字符串,因此是浅层副本。
为了避免这种情况,请使用数组的对象形式。

切片方法不会更改原始数组或字符串。它只剪切原始字符串或数组的一部分,并将其作为副本返回。 欲了解更多信息,请查看以下视频:
[为绝对初学者简化的切片法]

可能是您正在寻找的。试试这个

let animals = ['ant', 'bison', 'camel', [1, 2]];

let t = animals.slice();

t[0] = 'aaa';    // string (primitive datatype)
t[t.length-1][0] = 0;    // array (object)

console.log(t);
console.log(animals);
如果是浅拷贝-

  • 对象将反映原始位置的更改,因为它们是作为引用存储的(它们在堆中的地址)
  • 原始数据类型将反映原始位置的更改,因为它们直接存储在调用堆栈中(在执行上下文中)

您刚才不是引用了说明它是浅拷贝且不更改原件的文档吗?我不明白你的问题。@Bergi我认为文档读起来像是矛盾的。浅拷贝与旧拷贝具有相同的内存地址。因此,对其中任何一个所做的任何更改都会更改这两个的属性。但是在上面的例子中,它没有发生。@sunwarri0r“浅层副本与旧副本具有相同的内存地址”-不,它没有?你在哪里读到的?我想这是作者的理解,这就是他问这个问题的原因。我的评论也是错误的,我希望这篇文章也能帮助其他人