變數的解構賦值整理
阿新 • • 發佈:2018-11-04
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
都能取到值。
解構賦值的規則是,只要等號右邊的值不是物件或陣列,就先將其轉為物件。由於undefined
和null
無法轉為物件,所以對它們進行解構賦值,都會報錯。
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
的引數是一個物件,通過對這個物件進行解構,得到變數x
和y
的值。如果解構失敗,x
和y
等於預設值。
注意,下面的寫法會得到不一樣的結果。
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
的引數指定預設值,而不是為變數x
和y
指定預設值,所以會得到與前一種寫法不同的結果。
undefined
就會觸發函式引數的預設值。