关于拷贝应该是大家面试中经常被问到的问题,特此总结一下,为以后积累经验。
1,数据类型
巩固拷贝之前必须先回顾下数据的分类,知道其存储的位置。
基本数据类型:
1)分类 (String Number Boolean Undefined Null Symbol)
2)特点(数据存在栈内存中)
引用数据类型:
1)分类 (Object)
2)特点(栈内存中存的是指向堆内存中数据对象的一个地址值,可以理解成是一个指针。当寻找引用类型的值时,会先在栈内存中找到指针,然后堆内存中找到该引用对象。)
2,浅拷贝和深拷贝
何为拷贝:简易理解为重新复制一份数据。
浅拷贝和深拷贝主要针对引用类型数据而言。基本类型数据都是拷贝的栈内存中的值,改变拷贝后的值对原值不会产生影响。
赋值:
不产生新对象,当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在栈中的地址,而不是堆中的数据。两个对象指向同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容。
var a = 1;
var b = a;
b = 2;
console.log(a) //1
console.log(b) //2
var obj = {
name: '小明',
age: 18,
eat: [1,[2,3],[4,5,6]]
}
var obj1 = obj
obj1.name = '小明1'
obj1.eat[1] = [1,1]
console.log('obj',obj) //{ name: '小明1', age: 18, eat: [ 1, [ 1, 1 ], [ 4, 5, 6 ] ] }
console.log('obj1',obj1) //{ name: '小明1', age: 18, eat: [ 1, [ 1, 1 ], [ 4, 5, 6 ] ] }
浅拷贝:
产生新对象,如果被拷贝对象的属性中有引用类型的值,则拷贝的是数据在堆内存中的地址值,通过拷贝后得到的变量修改数据,源对象中的数据发生改变。
即浅拷贝只复制对象的第一层属性。
var obj2 = {
name: '小明',
age: 18,
eat: [1,[2,3],[4,5,6]]
}
var obj3 = clone(obj2)
obj3.name = '小明1'
obj3.eat[1

本文探讨了数据类型的区分,重点讲解了浅拷贝和深拷贝的概念,浅拷贝包括Object.assign()、Array.prototype.concat()、for in及扩展运算符等实现方式,而深拷贝则介绍了JSON.parse(JSON.stringify())方法和递归实现。浅拷贝仅复制第一层属性,而深拷贝对引用类型进行递归复制,确保修改拷贝对象不影响源对象。
最低0.47元/天 解锁文章
314

被折叠的 条评论
为什么被折叠?



