目录

获取对象的属性:

对象解构:

基础使用方式及原理:

解构赋默认值:

嵌套解构:

部分解构:


获取对象的属性:

        方式一:通过点操作符。

        方式二:通过中括号语法。

// 通过点语法来存取对象的属性
const obj = {
    name: 'javascript',
    age: 28,
}

console.log(obj.name); // javascript

obj.age = 100;

console.log(obj.age); // 100
// 通过中括号语法来存取对象的属性
const obj = {
    name: 'javascript',
    age: 28,
}

console.log(obj['name']); // javascript

obj['age'] = 100;

console.log(obj['age']); // 100

        相对于点操作符,中括号语法的可操作空间要大得多,比如以下例子:

const symbol = Symbol(), obj_name = 'name', obj_age = 'age';
const obj = {
    name: 'javascript',
    age: 28,
    [symbol]: 'symbol',
}

// 中括号语法的优势一:可以通过变量来访问属性
console.log(obj[obj_name]); // javascript
console.log(obj[obj_age]); // 28
console.log(obj[symbol]); // symbol

// 中括号语法的优势二:可以通过求中括号内表达式的值来访问属性
console.log(obj['na' + 'me']); // javascript

// 当属性名中包含可能会导致语法错误的字符,或者关键字、保留字时,也可以使用中括号语法
obj['my name'] = 'javascrit';

点操作符有较多的局限性,但是它任然是首选的属性存取方式,除非访问属性时必须使用变量,比如使用Symbol类型的变量作为属性的。

对象解构:

基础使用方式及原理:

        如果你需要频繁的使用某个对象的某个属性,那么你一定会想到把这个属性取出后赋值给某个变量的操作,如以下例子:

const obj = {
    name: 'javascript',
    age: 28,
}

const name = obj.name, age = obj.age;

console.log(name);

console.log(age);

对象解构的方式来简化代码。

①先声明变量,②从对象中找到对应属性,然后赋值给声明的变量

const obj = {
    name: 'javascript',
    age: 28,
}

// 如果此时我需要取出name、age属性,那么对象解构语法应该这样写:
const { name: objName, age: objAge } = obj;
/* 
  上一行代码完全等价于:
  const objName = obj.name, objAge = obj.age; 
 */

// 如果想让变量直接使用属性名,那么可以简写:
const { name, age } = obj;
/* 
  上一行代码完全等价于:
  const name = obj.name, age = obj.age; 
 */

   tips:①除了点语法解构外,还可以使用中括号语法解构; ② undefined 和 null 是不能解构的,否则抛出错误;③解构操作是针对对象而言,非对象的源数据结构会被尝试转换为对象再解构;④ 解构只是对属性的浅复制

// 使用中括号语法解构
const symbol = Symbol();

const obj = {
  name: 'javascript',
  [symbol]: 'Symbolic attribute',
}

const { [symbol]: sym, name } = obj;

console.log(sym); // Symbolic attribute
console.log(name); // javascript


// 尝试解构null 、 undefined会抛出错误
const { _ } = null;
// Uncaught TypeError: Cannot destructure property '_' of 'null' as it is null.

// 对原始值进行解构
const { length } = 'javascript';
const { valueOf } = 123;

console.log(length, valueOf); // 10 ƒ valueOf() { }

解构赋默认值:

const obj = {
  name: 'javascript',
}

// 未设置默认值
const { name: obj_name, age: obj_age } = obj;
console.log(obj_name, obj_age); // javascript undefined

// 设置默认值
const { name: objName, age: objAge = 18 } = obj;
console.log(objName, objAge); // javascript 18

嵌套解构:

const obj = {
  name: 'javascript',
  info: {
    original: 'C',
    environment: 'Google',
  },
}

const { name, info: { original, environment: env } } = obj;
console.log(name); // javascript
console.log(original); // C
console.log(env); // Google

在外层属性没有定义的情况下,不能使用嵌套解构,这就相当于在undefined上读取一个属性,因此会抛出错误。

部分解构:

涉及多个属性的解构赋值是一个输出无关的顺序化操作。

const person = {
  name: 'Tom',
  age: 21,
}

let name, age, email;

try {
  ({ name, info: { email }, age } = person);
} catch (err) {
  console.log(err); 
// TypeError: Cannot read properties of undefined (reading 'email')
}

console.log(name, email, age); // Tom undefined undefined

解构赋值会在抛出错误的步骤终止。