js对象
对象的属性
创建一个对象
// 创建对象那
let obj = Object()
// 添加属性
obj.name = "孙悟空"
obj.age = 18
obj.gender = "男"
// 修改属性
obj.name = "tom"
// 删除属性
delete obj.age
console.log(obj)
对象中可以存储多个各种种类的数据, 对象中存储的数据,我们称为, 属性
向对象中添加属性: 对象.属性名(key) = 属性值(value)
读取对象中的属性: 对象.属性名 (如果找不到该属性不会报错, 而是返回
undefined
)
对象的属性名, 属性值
let obj = Object()
let str = 'address'
obj["str"] = "孙悟空" //str : "孙悟空" --> obj.str = "孙悟空"
obj[str] = "孙悟空" //address : "孙悟空" --> obj.address = "孙悟空"
obj.a = "aa"
obj.b = true
obj.c = 123
obj.d = Object()
obj.d.name = "张三"
console.log(obj)
console.log("str" in obj) //检查obj对象中是否有str这个属性
使用
[]
来操作对象的属性, 可以使用变量, 对象的属性值可以是任何的数据类型, 也可以是一个对象,console.log("属性名" in 对象)
可以用来检查一个对象中是否有某个属性
对象字面量创建对象 :
let obj = {
name: '张三',
age: 20,
["gender"]: '男',
hello: { // obj的属性为一个 hello 对象
a : 1,
}
}
使用对象字面量创建对象, 可以直接在
{}
里向对象中添加属性
枚举属性
使用for-in
语句来获取对象中的全部属性
let obj = {
name: '张三',
age: 20,
["gender"]: '男',
hello: {
a : 1,
}
}
for (let i in obj) {
//获取obj对象中的全部属性(包括hello下的属性)并赋值给变量 i
console.log(i, obj[i]);
}
for-in 的循环体会执行多次, 有几个属性会执行几次, 每次执行时, 都会将一个属性值赋给我们定义的变量, 符号添加的属性不可以被枚
可变类型
不可变类型
let a = 10; //a --> x11(内存地址)
let b = 10; //b --> x11
a = 12 //a --> x12(内存地址指向x12), 不会对x11地址的值产生任何影响
console.log(a, b)
原始值属于不可变类型, 一旦创建无法修改它的值
在内存中不会存在重复的原始值
可变类型
let obj = Object() //obj --> x010
obj.name = "孙悟空"
obj.age = 15
let obj2 = Object()//obj2 --> x011
let obj3 = Object()//obj3 --> x012
//一但创建一个新的对象 就会在内存中立即创建一个新的内存空间地址
console.log(obj2 == obj3) //false
let obj4 = obj //obj4 --> obj(x010)指向obj的内存地址
console.log(obj == obj4)//true
obj4.name = "猪八戒" //当修改一个对象的属性时, 所有指向该对象的变量(内存地址)都会发生改变
console.log(obj, obj4)//name属性都为猪八戒
对象创建完成后, 可以任意的添加删除修改对象中的属性
如果有两个变量(
obj, obj4
)都指向同一个对象时, 通过一个变量修改对象的属性时, 对另一个变量也会产生影响
变量与对象
const obj = {
name: "孙悟空"
}
let obj2 = obj
obj2.name = "猪八戒" //修改对象
obj2 = null //修改变量(指针释放, 不在指向obj所在的地址)
obj2 = { //新的对象, 不会对obj产生影响
name: "猪八戒"
}
console.log(obj, obj2)
修改对象: 修改对象时, 如果其他变量(内存地址)指向该对象, 则所有变量都会受到影响
修改变量: 修改变量时, 只会影响当前的变量(通过
const
可以控制该变量不能再次被赋值)