07.对象
对象(object)
数据类型:
原始值
- 数值 Number
- 大整数 BigInt
- 字符串 String
- 空值 Null
- 未定义 Undefined
- 符号 Symbol
- 布尔值 Boolean
对象
对象是JS中的一种复合数据类型,它相当于一个容器,在对象中可以储存不同类型数据
原始值只能表示一些简单数据,不能表示复杂数据
现在假设有这样一个需求,需要在JS中来表示一个人的信息。人的信息包含了三个内容(姓名、性别和年龄)。
let name = '汤姆'
let gender = '男'
let age = 15
创建对象容器
我们可以直接通过{}
来创建对象。为了方便使用,还是需要将一个对象赋值给变量。
//创建一个对象,赋值给变量obj, 三种方法效果一样
let obj1 = new Object();
let obj2 = Object();
let obj3 = {};
现在变量obj所指向的值就是一个对象,你可以通过console.log()
打印一下看看对象到底长什么样子。
容器内添加属性
容器已经有了,下边可以向容器中添加值。对象中存储的值被称为属性,属性由两部分组成,属性名和属性值。向对象中添加属性:
对象.属性名 = 属性值
现在向对象obj中添加三个属性:
let obj3 = {}
obj3.name = "Tom"
obj3.aage = 13
obj3.gender = "male"
console.log(obj3)
添加属性后发现对象从{}
变为了{name: "Tom", gender: "男", age: 15}
。
属性名
- 通常属性名是一个字符串,所以属性名可以是任何值,没有特殊要求
但是如果你的属性名实在是太特殊了,比如数字开头123¥¥@@?!
不能直接使用,我们要用[" "]
来设置
let obj3 = {}
//不建议使用
// obj3.name = "Tom"
// obj3.if = 13
// obj3.let = "male"
// obj3["123$$##?!"] = "哈哈"
// console.log(obj3["123$$##?!"])
这些命名方法可以用但是不推荐使用
- 也可以使用符号(symbol)作为属性名,来添加属性,获取这种属性时也必须使用symbol
使用symbol添加的属性,通常是那些不希望被外界访问的属性
let obj3 = {}
let mySymbol = Symbol()
obj3[mySymbol] = "通过symbol添加的属性"
console.log(obj3[mySymbol])
- 使用
[]
去操作属性时,可以使用变量
let obj = {}
let str = "gender"
obj[str] = "male" //等价于 obj["gender"] = "male"
console.log(obj)
console.log(obj.gender)
属性值
对象的属性值可以是任何数据类型,也可以是对象(嵌套)
let obj = {}
obj.a = 123
obj.b = "我要吃肉"
obj.c = NaN
obj.d = true
obj.e = undefined
// 往对象里添加对象
obj.f = {}
obj.f.name = "张三"
console.log(obj)
读取容器内数据
值存进去了,要如何取出来呢?简单:对象.属性
如果读取的是一个对象容器中没有的属性,不会报错而是返回undefined
console.log(o.name) // Tom
console.log(o.gender) // 男
console.log(o.age) // 15
//reading an inexistent property
console.log(o.inexistence) //undefined
对象中的属性主要分成了两个部分,像o.name、o.gender、o.age中的name、gender、age这些属于属性名,属性名的要求和标识符的是一致,还有一些特殊的情况,我们暂时先不讨论。属性值可以是任意值,啥都行!啥都行!只要是值就可以作为对象的属性值!
修改容器内数据
直接在原有属性上重新赋值即可
o.name = "Cat"
删除容器内数据
delete o.name
检查容器内是否有某个属性
检查obj
对象里是否有name
这个属性,有返回true
否则false
console.log("name" in obj)
对象字面量
上边这种用法,属于先创建对象然后再添加属性。除此之外也可以在创建对象时,直接向对象中添加属性:
{属性名:属性值,属性名:属性值,属性名:属性值}
上边的对象o也可以使用这种方式创建:
let obj = {
name:'Tom',
age:15,
gender:'男'
}
这两种写法作用都是一样的没有任何区别,这种创建对象的方式叫做对象字面量,字面量的语法和CSS中声明块非常像,只是属性间不使用 ; 而是 , 隔开。另外需要注意,如果是最后的属性(上例中的 gender 属性),后边不能在写 , 了。
对象有了,也许你可以尝试自己创建一个对象,来存储一下你的个人信息。
枚举 for-in语句
let obj = {
name: 'Tom',
age: 15,
gender: '男',
[Symbol()]: "symbol属性" //不会被枚举
}
for (let aaa in obj) {
//注意每次遍历aaa只被赋予属性名,只能通过obj[aaa]形式获取属性值
console.log(aaa, obj[aaa])
}
补充内容
- 当一个对象的属性指向一个函数时
- 那么我们就称这个函数为该对象的方法
- 调用函数就称调用这个对象的方法
<script>
// 创建obj对象
let obj = {
name: "孙悟空",
age: 18,
// sayHello函数
sayHello: function () { console.log("hello!"); }
}
// 调用obj对象的sayHello()方法
obj.sayHello() //hello!
</script>