在JavaScript里,有一句名言:万物皆可对象。
Object是JavaScript基本数据类型之一(function也属于object,是特殊的object),其存储于堆中。
var obj = {} // 声明空对象
obj.key = 'xxx' // 添加属性、赋值
var res = obj[key] // 获取属性值
object以键值的方式存储数据,我们可以把多个同一所属的数据存储到一个对象里,例:
var obj = {
name: '华为P30 pro',
price: 5488,
color: 'black'
}
Object存储特性
JavaScript的数据类型分两种,值类型和引用属性,值类型有String、Number等;Object、Array、Function则是引用类型。
把Object用“等号”赋值给变量,其实是将object所指向的堆中地址赋值给变量,而不是在堆中另开一个空间。
var obj = { name: 'aaa' }
var num = obj
num.name = 'bbb'
alert(obj.name) // bbb
alert(obj.name) 显示bbb就可以说明了问题了,obj和num指向堆中同一块内存,当obj或num修改键值时,会使得所有指向这块地址的变量在操作时发生同样的变化。
深拷贝
所以,相对于浅拷贝,深拷贝在于开辟新地址,使得变量时不会都受到影响。
function deepCopy (o, c) { // o位被拷贝的对象,c为新对象
var c = c || {}
for (var i in o) {
if (typeof o[i] === 'object') { //要进行深度复制
if (o[i].constructor === Array) {
c[i] = []
} else {
c[i] = {}
}
deepCopy(o[i], c[i]) //递归调用
} else {
c[i] = o[i]
}
}
return c
}