vue深拷贝的常用实现方式:
一. 通过JSON.parse(JSON.stringify(obj))
- 优缺点
满足一般使用场景,用JSON.stringify把对象转成字符串,再用JSON.parse把字符串转成新的对象。
但这种方法的缺陷是会破坏原型链,并且无法拷贝属性值为function的属性
let obj = {
id: 11,
name: '李四',
age: 11,
}
let newObj = JSON.parse(JSON.stringify(obj))
二. Object.assign()
- 优缺点
当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝。
let foo = {
a: 1,
b: 2,
c: {
d: 1,
}
}
let bar = {};
Object.assign(bar, foo);
foo.a++;
foo.a === 2 //true
bar.a === 1 //true
foo.c.d++;
foo.c.d === 2 //true
bar.c.d === 1 //false
bar.c.d === 2 //true
三. 通过递归方式实现深拷贝
- 优缺点
比较全面的深拷贝,缺点是较为繁琐
//使用递归的方式实现数组、对象的深拷贝
function deepClone(obj) {
//判断拷贝的要进行深拷贝的是数组还是对象,是数组的话进行数组拷贝,对象的话进行对象拷贝
var objClone = Array.isArray(obj) ? [] : {};
//进行深拷贝的不能为空,并且是对象或者是
if (obj && typeof obj === "object") {
for (key in obj) {
if (obj.hasOwnProperty(key)) {
if (obj[key] && typeof obj[key] === "object") {
objClone[key] = deepClone(obj[key]);
} else {
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
四. 通过jQuery的extend方法实现深拷贝
推荐
var array = [1,2,3,4];
var newArray = $.extend(true,[],array); // true为深拷贝,false为浅拷贝
五. vue有现成的插件lodash实现深拷贝
推荐
安装
npm i --save lodash
引入
import _ from 'lodash';
使用
let a = any
const b = _.cloneDeep(a)
六. 其他
只有一级属性
- Obj类型
var obj = {
a: 1,
b: 2
}
var obj1 = {…obj}
- 数组类型
var arr1 = [1, 2, 3, 4]
var arr2 = arr1.concat()
var arr3 = arr1.slice(1)
网友评论