对象的介绍
对象是javaScript的数据类型。对象是一种复合值。他将很多值聚合在一起,可以通过名字访问这些值。对象可以看做对象的无序集合,每一个属性都是一个 名/值 对 ,属性名是字符串,因此我们可以看成字符串到值的映射。
对象不仅仅是字符串到值的映射,除了可以保持自有属性,javaScript对象还可以从一个成为原型的对象继承属性。对象的方法通常是继承的属性
js对象是动态的----可以新增删除属性
对象是可变的,我们通过引用来操作对象。如果一个变量x是指向一个对象的引用,那么执行代码let y=x;变量y也指向同一个对象引用。通过变量y修改这个对象也会对变量x造成影响
对象常用的用法是创建(create),设置(set), 查找(query),删除(delete).检测(test)和枚举(enumerate)它的属性。
属性包括名字和值,对象中不能存在两个同名的属性,属性名可以是任意字符串,值可以是任意js值,或者可以是一个getter或setter函数。除了名字和值之外,每个属性还有一些与之相关的值,成为‘属性特性’
数据的拷贝
数据拷贝,一般指栈堆中的栈拷贝。如果是基本数据,那么拷贝的就是数据;如果是复杂数据,那么拷贝的是指针,可能会导致多个指针指向同一个对象。
具体体现为,基本数据拷贝后,修改拷贝后的数据,不会被影响原数据;复杂数据拷贝后,修改拷贝后的数据,会作用到原数据,因为此时修改的是同一个指针指向的数据。
对象的浅拷贝
//1.直接赋值
let obj1 = {
name: 'yrg',
age: 22,
hobby: ['basketball','game']
}
let obj2 = obj1
obj1.name = 'xx'
console.log(obj1,obj2)
//2.Object.assign只复制一层对象的属性,如果对象中的属性值是对象,浅拷贝并不会复制对象属性中的属性
let obj3 = {
name: 'yrg',
age: 22,
person: {
name: 'Henry',
age: '21'
},
hobby: ['basketball','game']
}
let obj4 = Object.assign({},obj3 )
obj3 .age = '99'; //不会改变obj4 的age
obj4 .person.age = '25'; //也会改变obj3 的person.age
console.log(obj3 ,obj34)
对象的深拷贝
方法一:.JSON.parse(JSON.stringify(obj1))
let obj1 = {
name: 'yrg',
age: 22,
person: {
name: 'Henry',
age: 21,
},
hobby: ['basketball', 'game'],
}
let obj2 = JSON.parse(JSON.stringify(obj1))
obj1.person.age = 99
obj2.person.age = 199
console.log(obj1,obj2)
方法二:迭代递归 对象 for…in
let obj1 = {
name: 'yrg',
age: 22,
person: {
name: 'Henry',
age: 21,
},
hobby: ['basketball', 'game'],
}
function deepObject(obj) {
let cloneObj = {}
for (let key in obj) {
let objChild = Object.prototype.toString.call(obj[key])
cloneObj[key] =
objChild === '[object Array]' || objChild === '[object Object]'
? deepObject(obj[key])
: obj[key]
}
return cloneObj
}
let obj2 = deepObject(obj1)
obj2.person.age = 999
console.log(obj1, obj2)