https://juejin.im/post/5b5dcf8351882519790c9a2e ,
https://segmentfault.com/a/1190000016672263 ,这个博主写的很不错可以看看。
数据分为基本数据类型(String, Number, Boolean, Null, Undefined,Symbol)和对象数据类型。
- 基本数据类型的特点:直接存储在栈(stack)中的数据
- 引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在堆内存里
双胞胎的父母:堆内存声明一个新的对象
对象的赋值类似身体和影子的关系,相互影响。我们可以在这里做文章,如果想让对象之间相互影响,就让他们进行直接赋值,如果我们不想让他们相互影响,我们就让女娲重新创建双胞胎的父母。保证孩子出生的时候一样,往后的日子互不影响。
浅拷贝(只是进行一层拷贝)
var person = {
name: "taowuhua",
age: 18,
sex: "male"
}
var son ={}
function Clone(origin, target) {
var target = target || {};
for (var prop in origin) {
target[prop] = origin[prop]
}
return target
}
Clone(person,son)
深拷贝
互不影响,原始类型不用管,引用类型区分新array还是object
原始值是栈内存引用直接拷贝,
1)判断是不是原始值
2)判断是数组还是对象
3)建立相应的数组或者对象
4)当建立空数组之后把原来的数据党组原始值,新创建的数组或者对象进行上面的方法循环,据需判断是不是原始类型,然后进行相应的判断
var obj = {
name: "taowuhua",
age: 18,
card: ["visa", "master"],
wife: {
name: "mafengshui",
son: {
name: "andy"
}
}
}
var obj1 = {
}
function deepClone(origin, target) {
var target = target || {}
var toStr = Object.prototype.toString
var arrStr = "[object Array]"
//判断是不是原始值
for (var prop in origin) {
if (origin.hasOwnProperty[prop]) {
if (typeof origin[prop] === 'object' && origin[prop] !== null) {
if (toStr.call([origin[prop]) == Array]) {
target[prop] = []
} else {
target[prop] = {}
}
deepClone(origin[prop], target[prop])
} else {
target[prop] = origin[prop]
}
}
}
return target
}