JavaScript中存在两大数据类型
-
基本数据类型 (String,Number,Boolean,Undefined,Nll,Symbol)
-
引用数据类型 (Object,Array,Function)
浅拷贝
浅拷贝拷贝的是外层,内层拷贝的是内存地址
如果属性是基本数据类型,拷贝的就是基本数据类型的值,如果是引用数据类型,拷贝的就是内存地址
浅拷贝的实现方式
-
for in 循环,赋值
let obj = { name:'张三', age:18, msg:{ say:'hello' } } let newObj = {} for(var k in obj) { newObj[k] = obj[k] }
-
Object.assign
var newObj = Object.assign({},obj)
-
slice() 浅拷贝数组
var arr = [1,2,3,4] var newArr = arr.slice(0)
-
concat() 数组合并
var newArr = arr.concat()
-
扩展运算符
var newArr = [...arr]
深拷贝
深拷贝开辟了一个新的栈,两个对象的属性完全相同,但是他们对应的引用地址不同,改变一个对象的属性,不会影响另一个对象的属性
深拷贝的实现方式
-
JSON.stringify()
let obj = { name:'张三', age:18, msg:{ say:'hello' } } var newObj = JSON.parse(JSON.stringify(obj))
-
递归
var obj1 = {} function deepCopy(newObj, oldObj) { for (var k in oldObj) { // 拿到对象中的每一个值赋值给变量item var item = oldObj[k] // 判断item的基本数据类型,还是对象,还是数组 if (item instanceof Array) { //数组 newObj[k] = [] deepCopy(newObj[k], item) } else if (item instanceof Object) { //对象 newObj[k] = {} deepCopy(newObj[k], item) } else { //基本数据 newObj[k] = item } } } deepCopy(obj1, obj)