我有一个数组,希望分多次遍历它们,想借助slice()
函数在每次遍历前,得到一些连续的数组元素。
slice()
的官方文档说:
slice() 方法会浅复制(shallow copy)数组的一部分到一个新的数组,并返回这个新数组。
这里说的浅复制该怎样理解?
比如我的代码:
var a = ["php", "python", "java", "c++", "matlab", "ruby", "R", "julia"]
var b = a; // 个人认为这个是“浅复制”
b === a // true
var c = a.slice()
// 看了下c的内容:
c
["php", "python", "java", "c++", "matlab", "ruby", "R", "julia"]
c === a // false 为什么是false呢,slice()不是返回浅复制吗?
我对“浅复制”的理解是“赋予相同的内存地址”,所以b===a
是true
,但是c===a
为什么不是true
呢,slice()
返回的不是浅复制吗?
巴扎黑2017-04-11 12:45:00
数组是引用数据类型,由于b引用的是a,所以 b===a 返回true,a.slice()生成的是一个新数组,虽然表面上每个数组元素与a的一样,但本质上已经和a没有联系,而这个新数组被 c 引用,所以 c===a 返回false。
PHP中文网2017-04-11 12:45:00
很明显,你对“浅复制”的理解是错误的。
slice()
方法会浅复制(shallow copy)数组的一部分到一个新的数组,并返回这个新数组。
这个方法会返回一个新数组,出来的结果当然和原来的数组不同。所以,c === a
肯定是false
。
所谓浅复制
,是指这样的情况:
Array.clone = function(arr) {
const ans = [];
for(let i = 0; i < arr.length; i++) {
ans[i] = arr[i];
}
return(ans);
}
let a = [1,2,3,[4,5,6],[7,8,9]],
b = Array.clone(a);
console.log(a === b); //false
console.log(a[3]); //[4,5,6]
console.log(a[3] === b[3]); //true
console.log(a[4] === b[4]); //true
所谓深复制
是这样的:
Array.clone = function(arr) {
const ans = [];
for(let i = 0; i < arr.length; i++) {
if(arr[i].length) {
ans[i] = Array.clone(arr[i]);
} else {
ans[i] = arr[i];
}
}
return(ans);
}
let a = [1,2,3,[4,5,6],[7,8,9]],
b = Array.clone(a);
console.log(a === b); //false
console.log(a[3]); //[4,5,6]
console.log(a[3] === b[3]); //false
console.log(a[4] === b[4]); //false