Javascript 切片方法 return 是浅拷贝吗?
Does Javascript slice method return a shallow copy?
在 Mozilla 开发人员翻译的韩语 lang 中说 'slice method' returns 一个浅拷贝的新数组。
所以我测试了我的代码。
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);
但是,如果切片方法returns shallow array, animals 数组应更改为['ant', 'bison', 'aaa', 'duck', 'elephant'].
为什么是浅拷贝?
字符串在JavaScript中是基本类型,所以你会得到一个新的数组,里面有新的字符串。
您的测试数组应该是一个对象数组:
var animals = [{name: 'ant'}, {name: 'bison'}, {name: 'camel'}, {name: 'duck'}, {name: 'elephant'}];
var t = animals.slice(2,4);
console.log(t);
t[0].name = 'aaa';
console.log(t);
console.log(animals);
slice
不会改变原始数组。
它 return 是原始数组元素的浅表副本。
原始数组的元素被复制到 returned 数组中,如下所示:
对于对象引用(而不是实际对象),slice 将对象引用复制到新数组中。原始数组和新数组都引用同一个对象。如果引用的对象发生更改,则更改对新数组和原始数组都是可见的。
对于字符串、数字和布尔值(不是字符串、数字和布尔对象),slice 将值复制到新数组中。对一个数组中的字符串、数字或布尔值的更改不会影响另一个数组。
如果向任一数组添加新元素,则不会影响另一个数组。(source)
在你的例子中,数组由字符串组成,切片上的字符串将 return 复制到数组的新字符串,因此是一个浅拷贝。
为了避免这种情况,请使用数组的对象形式。
切片方法不会改变原始数组或字符串。它只剪切原始字符串或数组的一部分,并将其 returns 作为副本。
想要了解更多,请观看下面的视频:
https://youtu.be/mUH8hPQfMbg [切片方法对初学者来说很简单]
可能您正在寻找这个。试试这个!
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);
如果是浅拷贝-
- 对象将反映原始位置的变化,因为它们是作为引用存储的(指向它们在堆中的地址)。
- 原始数据类型将不会反映原始位置的变化,因为它们直接存储在调用堆栈中(在执行上下文中)。
在 Mozilla 开发人员翻译的韩语 lang 中说 'slice method' returns 一个浅拷贝的新数组。
所以我测试了我的代码。
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);
但是,如果切片方法returns shallow array, animals 数组应更改为['ant', 'bison', 'aaa', 'duck', 'elephant'].
为什么是浅拷贝?
字符串在JavaScript中是基本类型,所以你会得到一个新的数组,里面有新的字符串。
您的测试数组应该是一个对象数组:
var animals = [{name: 'ant'}, {name: 'bison'}, {name: 'camel'}, {name: 'duck'}, {name: 'elephant'}];
var t = animals.slice(2,4);
console.log(t);
t[0].name = 'aaa';
console.log(t);
console.log(animals);
slice
不会改变原始数组。
它 return 是原始数组元素的浅表副本。
原始数组的元素被复制到 returned 数组中,如下所示:
对于对象引用(而不是实际对象),slice 将对象引用复制到新数组中。原始数组和新数组都引用同一个对象。如果引用的对象发生更改,则更改对新数组和原始数组都是可见的。
对于字符串、数字和布尔值(不是字符串、数字和布尔对象),slice 将值复制到新数组中。对一个数组中的字符串、数字或布尔值的更改不会影响另一个数组。 如果向任一数组添加新元素,则不会影响另一个数组。(source)
在你的例子中,数组由字符串组成,切片上的字符串将 return 复制到数组的新字符串,因此是一个浅拷贝。 为了避免这种情况,请使用数组的对象形式。
切片方法不会改变原始数组或字符串。它只剪切原始字符串或数组的一部分,并将其 returns 作为副本。 想要了解更多,请观看下面的视频: https://youtu.be/mUH8hPQfMbg [切片方法对初学者来说很简单]
可能您正在寻找这个。试试这个!
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);
如果是浅拷贝-
- 对象将反映原始位置的变化,因为它们是作为引用存储的(指向它们在堆中的地址)。
- 原始数据类型将不会反映原始位置的变化,因为它们直接存储在调用堆栈中(在执行上下文中)。