对象
对象是JS中的一种符合数据类型,它相当于一个容器,在对象中可以存储各种不同类型数据.
对象中可以储存多个各种类型的数据,
对象中存储的数据,我们称为属性
向对象中添加属性:
对象.属性名 = 属性值
读取对象中的属性
对象.属性名
如果读取的是一个对象中没有的属性,不会报错而是返回undefined
<script>
// 创建对象
let obj = Object()
// console.log(obj) //返回{}
//向对象中添加属性
obj.name = "孙悟空"
obj.age = 18
obj.gender = "男"
//修改属性
obj.name = "Tom sun"
//删除属性
delete obj.name
console.log(obj)
// console.log(obj.name) //undefined ,因为obj.name属性已删掉
</script>
对象的属性
属性名
通常属性名就是一个字符串,所以属性名可以是任何值,没有什么特殊要求
但是如果你的属性名太特殊了,不能直接使用,需要使用[]来设置
也可以使用符号(symbol)作为属性名,来添加属性,获取这种属性时,也必须使用symbol (使用symbol添加的属性,通常是那些不希望被外界访问的属性)
使用[]去操作时,可以使用变量
属性值
对象的属性可以是任意的数据类型
使用typeof检查一个对象时,会返回object
in 运算符
用来检查对象中是否含有某个属性
语法 属性名 in obj
如果有返回true,没有返回false
<script>
//创建对象
let obj = Object()
//添加属性
// obj.name = "孙悟空"
// obj.if = "haha"
// obj["122345#@1!#!1"] = "呵呵" //不建议
// let mySymbol = Symbol()
// let newSymbol = Symbol()
// // 使用symbol作为属性名
// obj[mySymbol] = "通过symbol添加的属性"
// console.log(obj[mySymbol])
obj.age = 18
obj["gender"] = "男"
// console.log(obj.gender)
// console.log(obj["gender"])
let str = "address"
obj[str] = "花果山" //等价于obj["adress"] = "花果山"
// console.log(obj)
// console.log(obj[str]) //返回 花果山
// console.log(obj["address"]) //和上面的代码一样的意思,返回 花果山
obj.str = "haha" //使用.的形式添加属性时,不能使用变量
// console.log(obj) //返回 {age: 18, gender: "男", address: "花果山", str: "haha"}
obj.a = 123
obj.b = 'world'
obj.c = true
obj.d = 123n
obj.f = Object()
obj.f.gender = "女" //
obj.f.age = 28 //
// console.log(obj)
console.log(obj.f.age) //获取age ----------> 返回 28
//用typeof检查obj
console.log(typeof obj) //返回 object
//in运算符 ---------> 检查obj里面有没有name --------> 有 返回true,没有则返回false
console.log("name" in obj) // 返回false
console.log("age" in obj) //返回true
</script>
对象字面量
对象的字面量:
可以直接使用{}来创建对象
使用{}所创建的对象,可以直接向对象中添加属性
语法:
{
属性名:属性值,
[属性值]:属性值,
}
</script>
let obj = Object() //第一种创建对象的方式
// let obj2 = {} //第二种创建对象的方式
let mySymbol = Symbol()
let obj2 = {
age:"800",
address:"猴山",
["gender"]:"男",
[mySymbol] : "特殊的属性",
hello:{
a:1,
b:true
}
} //第二种创建对象的方式,可以直接在对象中添加属性
obj2.name = "孙三娘"
console.log(obj) //返回 {}
console.log(obj2) //返回 {}
console.log(typeof obj2)
</script>
枚举对象中的属性
枚举属性:指将对象中的所有的属性全部获取
for-in语句
//for-in语法:
for(let propName in 对象){
语句...
}
for-in的循环体会执行多次,有几个属性就会执行几次,
每次执行时,都会将一个属性名赋值给我们所定义的变量
注意:并不是所有的属性都可以枚举,比如 使用符号添加的属性
let obj = {
name:'孙三娘',
age:18,
gender:"女",
adderss:"猴山",
[Symbol()]:"测试的属性" , //没有输出 ------> 符号添加的属性是不能枚举
}
for(let propName in obj){
// console.log(1) //1打印了三次---------->因为对象有三个属性
// console.log(propName) //返回 name age gender address
// console.log(propName,obj.propName) // 返回undefined,想要输出变量就不能使用点
console.log(propName,obj[propName])
}
可变类型
原始值都属于不可变类型,一旦创建就无法修改
在内存中不会创建重复的原始值
对象属于可变类型
对象创建完成后,可以任意的添加删除对象中的属性
注意:
当对两个对象进行相等或全等比较时,比较的是对象的内存地址
如果有两个变量同时指向一个对象, 通过一个变量修改对象时,对另外一个变量也会产生影响
<script>
// let obj = {name:"孙三娘"}
let obj = Object()
obj.name="孙三娘"
obj.age = 18
let obj2 = Object()
// let obj3 = Object()
let obj3 = obj2
// console.log(obj)
// console.log(obj2)
// console.log(obj3)
console.log(obj2 === obj3) //false ---> 比较obj2和obj3其实是比较两个对象的地址,虽然两个变量所对应的对象都是空对象,但是地址不一样,所以不可能相等
// let obj3 = obj2 ---> console.log(obj2 === obj3) ----> true
let obj4 = obj
obj4.name = "孙四娘" //obj和obj4里的name都会变成孙四娘 ----> 当修改一个对象时,所有指向该对象的变量都会受到影响
console.log("obj",obj)
console.log("obj4",obj4)
console.log(obj === obj4) // true
</script>
改变变量和改对象
修改对象
修改对象时,如果有其他变量指向该对象
则所有指向该对象的变量都会受到影响
修改变量
修改变量时,只会影响当前的变量
在使用变量存储对象时,很容易因为改变变量指向的对象,提高代码的复杂度,所以通常情况下,声明存储对象的变量时也会使用const
注意:const只是禁止变量被重新赋值,对对象的修改没有任何影响
<script>
const obj = {
name:"孙三娘"
}
const obj2 = obj
// obj2 = {} // ----> 使用const时会报错,使用let时不会报错,因为
// obj2 = {} // -----> 修改变量---------给变量obj2赋值新对象
// obj2.name="孙四娘" // obj的name不变,因为已经给obj2赋值新对象了,所以不影响obj的name属性
obj2.name="孙四娘" // -------> 修改对象
// obj2 = null //--------> 修改变量 --------- obj2返回null,且不影响obj
// console.log(obj)
// console.log(obj2)
const obj3 ={
name:"孙老四"
}
obj3.name = "孙孙孙"
console.log(obj3)
</script>
7.方法
方法(method):当一个对象的属性指向一个函数,那么我们就称这个函数是该对象的方法,调用函数就称为调用对象的方法。
<script>
let obj = {}
obj.name = "孙三娘"
obj.age = 35
obj.sayHello = function fn() {
alert("hello")
}
// console.log(obj)
obj.sayHello() //alert执行 对象的属性也可以是函数
document.wright() //调用document.wright的方法 -----> 方法:一定是对象.方法
string() //函数
</script>