1const age = 12
2const name = 'Amy'
3const person = { age, name } // {age: 12, name: "Amy"}
4// 等同于 person = {age: age, name: name}
1const person = {
2 sayHi() {
3 console.log('Hi')
4 },
5}
1const obj = {
2 *myGenerator() {
3 yield 'hello world'
4 },
5}
1let a = 'aaa';
2let obj = {
3 [a]: 'bbb',
4};
5
6const obj = {
7 ['he' + 'llo']() {
8 return 'Hi';
9 },
10};
11obj.hello(); // "Hi"
1const age = { age: 15 }
2const name = { name: 'Amy' }
3const person = { ...age, ...name } // {age: 15, name: "Amy"}
:::tip 注意如果两个对象有同名的属性会被覆盖(数组也是同理) :::
1Object.assign(target, source_1, ···)
将后面所有可枚举的属性赋值到 target 对象中。重复的值会覆盖
1const target = { a: 1 }
2const object2 = { b: 2 }
3const object3 = { c: 3 }
4Object.assign(target, object2, object3) // {a: 1, b: 2, c: 3}
5// 第一个参数是目标对象,后面的参数是源对象
只有一个参数不是对象,也会转换为对象返回
1Object.assign(3) // Number {3}
第一个参数时 null 或 undefined 会报错
1Object.assign(null) // TypeError: Cannot ...
null 和 undefined 放第二个之后会跳过
1Object.assign(1, undefined) // Number {1}
2// 注意: assign 的属性拷贝是浅拷贝
3const sourceObj = { a: { b: 1 } }
4const targetObj = { c: 3 }
5Object.assign(targetObj, sourceObj)
6targetObj.a.b = 2 // 原始值修改
7sourceObj.a.b // 2 已经拷贝的值也会跟着变
同名属性会被替换
1targetObj = { a: { b: 1, c: 2 } }
2sourceObj = { a: { b: 'hh' } }
3Object.assign(targetObj, sourceObj) // {a: {b: "hh"}}
数组的处理
1Object.assign([2, 3], [5]) // [5,3] 下标0被覆盖
1const firstName = message?.body?.user?.firstName || 'default'
2const fooValue = myForm.querySelector('input[name=foo]')?.value
3// 如果左侧的值为 null或undefined 则不再往下运算
4iterator.return?.() // 判断方法是否存在
1a?.b
2// 等同于
3a == null ? undefined : a.b
4
5a?.[x]
6// 等同于
7a == null ? undefined : a[x]
8
9a?.b()
10// 等同于
11a == null ? undefined : a.b()
12
13a?.()
14// 等同于
15a == null ? undefined : a()