let appState = {
title: {
text: 'React.js 小书',
color: 'red',
},
content: {
text: 'React.js 小书内容',
color: 'blue'
}
}
const oldState = appState
console.log(appState)
appState.title.text = '《React.js 小书》';
console.log(oldState !== appState) //false
console.log(oldState != appState) //false
更新了对象的内容,两个对象比较还是相同的,如打印结果,不知怎么理解?
其实不是两个对象的比较,而是引用的比较
ECMAScirpt有五个基本类型(number,string,boolean,null,undefined)和一种引用类型(object)
如果你
基本类型赋值会在该变量上创建一个新值,m就是n的一个副本
而当一个变量向另一个变量赋值引用类型的值时,与基本类型不同的是,这个值得副本是一个指针,而这个指针指向存储在堆内存中的一个对象,oldState 和 appState都指向同一个内存地址
引用类型占用的空间比较大,所以用指针和变量连接起来
这个经常被误用为拷贝,但是这种 ‘拷贝’ 后,原值会受到影响,所以浅拷贝用 for in去遍历,深拷贝for in + 递归拷贝深层