💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
* 对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。 ``` const node = { loc: { start: { line: 1, column: 5 } } } let { loc, loc: { start }, loc: { start: { line }} } = node line // 1 loc // {start: {line: 1, column: 5}} start // {line: 1, column: 5} ``` > 上面代码有三次解构赋值,分别是对`loc`、`start`、`line`三个属性的解构赋值。 * 如果解构模式是嵌套的对象,而且子对象所在的父属性不存在,那么将会报错。 ``` let {foo: { bar }} = {baz: 'baz'} // Uncaught TypeError: Cannot destructure property `bar` of 'undefined' or 'null'. ``` > 上面代码中,等号左边对象的`foo`属性,对应一个子对象。该子对象的`bar`属性,解构时会报错。原因很简单,因为`foo`这时等于`undefined`,再取子属性就会报错。 * 注意,对象的解构赋值可以取到继承的属性。 ```javascript const obj1 = {}; const obj2 = { foo: 'bar' }; Object.setPrototypeOf(obj1, obj2); const { foo } = obj1; foo // "bar" ``` > 上面代码中,对象`obj1`的原型对象是`obj2`。`foo`属性不是`obj1`自身的属性,而是继承自`obj2`的属性,解构赋值可以取到这个属性。 > 把`obj1`和`obj2`打印出来,如下图: > ![](https://img.kancloud.cn/cb/e0/cbe02eefc3ec2ec9ee06ecfda76dd56b_227x185.png) *****