跳转到内容

对象

一个对象本质是一组键值对(key-value),可以根据键(key)找到对应的值(value)。

键(key)在绝大多数情况下都是字符串,值(value)可以是任何类型。

比如值可以是数字、字符串、布尔值这样的简单值:

const person = {
name: 'xiaoming',
age: 20,
isStudent: true
}

也可以对象嵌套对象:

const person = {
// ...
address: {
city: 'beijing',
street: 'haidian'
}
}

甚至可以是函数,当函数作为对象的属性时,我们称之为方法

const person = {
// ...
sayHello() {
console.log('hello')
}
}

通常使用点语法来访问对象的属性和方法:

person.name // 'xiaoming'
person.age // 20
person.isStudent // true
person.address.city // 'beijing'
person.address.street // 'haidian'
person.sayHello() // 'hello'

也可以使用方括号语法,方括号语法支持将表达式作为键名,访问对象的属性,这具有极大的灵活性:

const keys = ['name', 'age', 'isStudent']
person[keys[1]] // 20

思考以下代码:

// 声明一个名为 obj1 的对象,有一个属性 a,对应的值为 1
const obj1 = {
a: 1
}
// 声明一个 obj2,把 obj1 赋值给 obj2
const obj2 = obj1
// 把 obj2 的 a 属性对应的值改为 2
obj2.a = 2
// 此时 obj1.a 的值是多少?
console.log(obj1.a)

obj1.a 的值是多少?正确答案是 2,如果你感到困惑,以下是逐行分析:

  1. 运行 const obj1 = { a: 1 } 时,先在内存中开辟了一块空间,将 a: 1 存入这个空间里,然后使 obj1 指向这块内存空间

  1. 运行 const obj2 = obj1,创建一个 obj2 变量,让 obj2 也指向 obj1 所指向的内存空间

  1. 运行 obj2.a = 2,根据 obj2 找到了这片内存空间,然后将其中 a 的值修改为了 2

  1. 此时再访问 obj1.a, obj1 指向的内存空间中,a 的值已经被改成 2 了

这告诉我们,当你将一个对象赋值给一个变量时,变量存储的是对象的引用,在上述的例子中,通过 obj1 可以找到 { a: 1 },但 obj1 不是 { a: 1 },只是它的一个引用,同理 obj2 也只是这个对象的引用。

1. 以下代码的执行结果是什么?

const obj1 = { a: 1 }
function changeObj(obj) {
obj.a += 1
}
changeObj.a = 3
changeObj(obj1)
console.log(obj1.a)

2. 下列选项语法正确的有?(多选)

3. 以下代码的执行结果是什么?

const obj1 = {
a: {
b: 'c'
},
c: {
d: 4
},
d: 5
}
const obj2 = obj1[obj1.a.b]
obj2.d = 10
console.log(obj1.d)