1. 程式人生 > >變數的解構賦值整理

變數的解構賦值整理

1、陣列的解構賦值

基本用法 

ES6 允許按照一定模式,從陣列和物件中提取值,對變數進行賦值,這被稱為解構(Destructuring)。

let x = 1;
let y = 2;
let z = 3;

let x = 1,
    y = 2,
    z = 3;

let [x,y,z] = [1,2,3];   //ES6陣列解構

例項:

let [foo, [[bar], baz]] = [1, [[2], 3]];
foo // 1
bar // 2
baz // 3

let [ , , third] = ["foo", "bar", "baz"];
third 
// "baz" let [x, , y] = [1, 2, 3]; x // 1 y // 3

rest 運算子

rest運算子也是三個點號,不過其功能與擴充套件運算子恰好相反,把逗號隔開的值序列組合成一個數組

rest運算子配合解構使用:

let [head, ...tail] = [1, 2, 3, 4];
head // 1
tail // [2, 3, 4]

let [x, y, ...z] = ['a'];
x // "a"
y // undefined
z // []

 

預設值 

解構賦值允許指定預設值。

let [a = 1] = ['a'];   //
=====> var a = 'a' || 1; let [a = 1] = []; // ===> var a = 1 // 除了undefined let [b = 1] =[undefined]; //1 如果解構的值為undefined 取預設值 let [b = 1] =[null]; //null let [a, b = 2] = ['a']; //a = 'a' b = 2; let [a=1,b=2] = ['a',undefined];//a = 'a' b =2

注意,ES6 內部使用嚴格相等運算子(===),判斷一個位置是否有值。所以,只有當一個數組成員嚴格等於undefined

,預設值才會生效。

如果預設值是一個表示式,那麼這個表示式是惰性求值的,即只有在用到的時候,才會求值。

function f() {
  console.log('aaa');
}

let [x = f()] = [1];    //1
let [x = f()] = [];    //x = 'aaa'

let [a = 1,b = a] = [];  //a = 1 b =1
let [a = 1,b = a] = [5,8];  //a = 5 b =8 由於惰性求值,他的預設值取8
let [a = b,b = 5] =[,8];    //錯誤 由於b在let宣告前使用所以報錯

 


2、物件的解構賦值

物件的解構賦值的內部機制,是先找到同名屬性,然後再賦給對應的變數。真正被賦值的是後者,而不是前者。

let {name:a,age:b} = {age:20,name:'abc'};  //b = 20 a = 'abc' name是匹配模式,a是變數
let {name,age} = {age:20,name:'abc'};  //name = 'abc' age = '20'
let {abc:name,age:age} = {age:20,name:'abc'};   //錯誤  name為變數, abc是物件中匹配的值
let aa = {age:20,name:'abc'};
let {abc:name,age:age} = aa; 

預設值 

let {x:y=10} ={y:5};  //如果輸出y的值y=10 x為匹配模式,後面沒有對應的x,所以預設值取y=10
let {x} ={y:5};   //輸出x的值 x = undefined 

 


 

3、字串的解構賦值

const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"

 


 

4、數值和布林值的解構賦值

解構賦值時,如果等號右邊是數值和布林值,則會先轉為物件。

let {toString: s} = 123;
s === Number.prototype.toString // true

let {toString: s} = true;
s === Boolean.prototype.toString // true

上面程式碼中,數值和布林值的包裝物件都有toString屬性,因此變數s都能取到值。

解構賦值的規則是,只要等號右邊的值不是物件或陣列,就先將其轉為物件。由於undefinednull無法轉為物件,所以對它們進行解構賦值,都會報錯。

let { prop: x } = undefined; // TypeError
let { prop: y } = null; // TypeError

 


 

5、函式引數的解構賦值

預設值 

function move({x = 0, y = 0} = {}) {
  return [x, y];
}

move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, 0]
move({}); // [0, 0]
move(); // [0, 0]

上面程式碼中,函式move的引數是一個物件,通過對這個物件進行解構,得到變數xy的值。如果解構失敗,xy等於預設值。

注意,下面的寫法會得到不一樣的結果。


function move({x, y} = { x: 0, y: 0 }) { // 等號右邊相當於一個預設引數 而不是x,y預設值 return [x, y]; } move({x: 3, y: 8}); // [3, 8] move({x: 3}); // [3, undefined] move({}); // [undefined, undefined] move(); // [0, 0]

上面程式碼是為函式move的引數指定預設值,而不是為變數xy指定預設值,所以會得到與前一種寫法不同的結果。

undefined就會觸發函式引數的預設值。