900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 数组的深浅拷贝总结

数组的深浅拷贝总结

时间:2019-12-07 23:50:51

相关推荐

数组的深浅拷贝总结

数组的浅拷贝(只能拷贝基本类型)

ES5 方法总结

1.slice方法

let arr = [2,4,434,43]

let arr1= arr.slice();

console.log(arr1); // [ 2, 4, 434, 43 ]

2. 遍历数组

Array.prototype.clone = function(){

let a=[];

for(let i=0,l=this.length;i<l;i++) {

a.push(this[i]);

}

return a;

}

let brr = ['aaa','bbb','ccc','wwwww','ddd']

let arr2 = brr.clone()

console.log(arr2)

3. concat()

Array.prototype.clone=function(){

return [].concat(this);

//或者 return this.concat();

}

let crr = ['aaa','asss']

let arr3 = crr.clone()

console.log(arr3)

ES6 方法总结

1. Object.assign() 浅复制,也可以实现数组的克隆

let arr4 = ['sdsd',123,123,123]

let arr5 = []

Object.assign(arr5,arr4)

arr4[1] = 'aaaa'

console.log(arr4,arr5) // [ 'sdsd', 'aaaa', 123, 123 ] [ 'sdsd', 123, 123, 123 ]

2. 扩展运算符

const a1 = [1, 2];

const a2 = [...a1];

console.log(a2);

const d = {

name: 'zhangsan',

age: 12

}

const e = {...d};

d.age = 28;

console.log(d,e)

————————————————————————————————————————————————————————

数组的深拷贝

技巧一:不仅可拷贝数组还能拷贝对象(但不能拷贝函数)

var arr = ['old', 1, true, ['old1', 'old2'], {old: 1}];

var new_arr = JSON.parse(JSON.stringify(arr))

console.log(new_arr);

下面是浅拷贝一个通用方法,实现思路:遍历对象,把属性和属性值都放在一个新的对象里

var shallowCopy = function (obj) {

// 只拷贝对象

if (typeof obj !== 'object') return;

// 根据obj的类型判断是新建一个数组还是一个对象

var newObj = obj instanceof Array ? [] : {};

// 遍历obj,并且判断是obj的属性才拷贝

for (var key in obj) {

if (obj.hasOwnProperty(key)) {

newObj[key] = obj[key];

}

}

return newObj;

}

console.log(shallowCopy(arr));

下面是深拷贝一个通用方法,实现思路:拷贝的时候判断属性值的类型,如果是对象,继续递归调用深拷贝函数

var arr = ['old', 1, true, ['old1', 'old2'], {old: 1}];

var deepCopy = function(obj) {

// 只拷贝对象

if (typeof obj !== 'object') return;

// 根据obj的类型判断是新建一个数组还是一个对象

var newObj = obj instanceof Array ? [] : {};

for (var key in obj) {

// 遍历obj,并且判断是obj的属性才拷贝

if (obj.hasOwnProperty(key)) {

// 判断属性值的类型,如果是对象递归调用深拷贝

newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];

}

}

return newObj;

}

console.log(deepCopy(arr));

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。