## 2.對象的解構賦值
對象的解構與數組有一個重要的不同。數組的元素是按次序排列的,變量的取值由它的位置決定;而對象的屬性沒有次序,變量必須與屬性同名,才能取到正確的值。
~~~javascript
let { bar, foo } = { foo: "aaa", bar: "bbb" };
foo // "aaa"
bar // "bbb"
let { baz } = { foo: "aaa", bar: "bbb" };
baz // undefined
~~~
上面代碼的第一個例子,等號左邊的兩個變量的次序,與等號右邊兩個同名屬性的次序不一致,但是對取值完全沒有影響。第二個例子的變量沒有對應的同名屬性,導致取不到值,最后等于`undefined`。
如果變量名與屬性名不一致,必須寫成下面這樣。
~~~javascript
let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
baz // "aaa"
let obj = { first: 'hello', last: 'world' };
let { first: f, last: l } = obj;
f // 'hello'
l // 'world'
~~~
這實際上說明,對象的解構賦值是下面形式的簡寫(參見《對象的擴展》一章)。
~~~javascript
let { foo: foo, bar: bar } = { foo: "aaa", bar: "bbb" };
~~~
也就是說,**對象的解構賦值的內部機制**,**是先找到同名屬性,然后再賦給對應的變量**。真正被賦值的是后者,而不是前者。
>下邊這得好好看下:
~~~javascript
let { foo: baz } = { foo: "aaa", bar: "bbb" };
baz // "aaa"
foo // error: foo is not defined
~~~
上面代碼中,**`foo`是匹配的模式,`baz`才是變量**。真正被賦值的是變量`baz`,而不是模式`foo`。
與數組一樣,解構也可以用于嵌套結構的對象。
~~~javascript
let obj = {
p: [
'Hello',
{ y: 'World' }
]
};
let { p: [x, { y }] } = obj;
x // "Hello"
y // "World"
~~~
注意,這時`p`是模式,不是變量,因此不會被賦值。如果`p`也要作為變量賦值,可以寫成下面這樣。
~~~javascript
let obj = {
p: [
'Hello',
{ y: 'World' }
]
};
let { p, p: [x, { y }] } = obj;
x // "Hello"
y // "World"
p // ["Hello", {y: "World"}]
~~~
下面是另一個例子。
~~~javascript
const node = {
loc: {
start: {
line: 1,
column: 5
}
}
};
let { loc, loc: { start }, loc: { start: { line }} } = node;
line // 1
loc // Object {start: Object}
start // Object {line: 1, column: 5}
~~~
上面代碼有三次解構賦值,分別是對`loc`、`start`、`line`三個屬性的解構賦值。注意,最后一次對`line`屬性的解構賦值之中,只有`line`是變量,`loc`和`start`都是模式,不是變量。
- React進階
- React進階-組件 & Props
- React進階-組件 & Props - 代碼篇
- 組件擴展-組件生命周期
- 組件擴展-組件生命周期-代碼篇
- React-Redux
- Redux入門教程-基本用法
- Redux入門教程-基本用法-代碼篇
- Redux入門教程-中間件和異步操作
- Redux入門教程-React-Redux 的用法
- Redux入門教程-React-Redux的用法-代碼篇
- ES6-變量的解構賦值
- 數組的解構賦值
- 對象的解構賦值
- React用法
- JSX技巧
- ES6-神奇的...
- yarn+webpack+react零基礎創建項目
- 0-init
- 1-webpack.config.md
- 2-react相關依賴
- 3.編寫react相關代碼
- pnpx-react-config
- pnpx+create-react
- pnpm+react-config
- pnpm+react-antd