解構賦值json
從數組中提取值,按照對應位置,對變量賦值數組
只要等號右邊的值不是對象或數組,就先將其轉爲對象。數據結構
因爲 undefined 和 null 沒法轉爲對象,因此對它們進行解構賦值,都會報錯函數
let [a, b, c] = [1, 2, 3];spa
只要某種數據結構具備 Iterator 接口,均可以採用數組形式的解構賦值prototype
應用:3d
const person = { name: 'RyenToretto', age: 22, sex: '男' }; // 解構賦值 const {name, age, sex} = person; // 缺點: 必須同名屬性 console.log(name. age, sex); // 對比以前,明顯好用了不少 console.log(person.name, person.age, person.sex);
const arr = [1, 3, 5, 7, 9]; const [a, b, c, d, e, f=-1] = arr; // 是一組有序的賦值, 容許默認賦值 此時 f=-1,由於索引值爲 undefined const [aa, , cc] = arr; // aa=1, cc=5
//右邊的值 轉爲對象之後不具有 Iterator 接口 let [foo] = 1; let [foo] = false; let [foo] = NaN; let [foo] = undefined; let [foo] = null; let [foo] = {}; // {} 自己就不具有 Iterator 接口
let [foo = true] = []; foo // true let [x, y = 'b'] = ['a']; // x='a', y='b' let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
注意,ES6 內部使用嚴格相等運算符(===
),判斷一個位置是否有值code
因此,只有當一個數組成員嚴格等於undefined
,默認值纔會生效。對象
let [x = 1] = [undefined]; x // 1 let [x = 1] = [null]; x // null
若是默認值是一個表達式,那麼這個表達式是惰性求值的,即只有在用到的時候,纔會求值blog
function f() { console.log('aaa'); } let [x = f()] = [1]; // 因爲 x 能夠取 1 ,因此函數 f() 不會被執行
let [x = 1, y = x] = []; // x=1; y=1 let [x = 1, y = x] = [2]; // x=2; y=2 let [x = 1, y = x] = [1, 2]; // x=1; y=2 let [x = y, y = 1] = []; // Reference Error: y is not defined
let { foo, bar } = { foo: "aaa", bar: "bbb" }; foo // "aaa" bar // "bbb"
實際上的完整寫法: let { foo: foo, bar: bar } = { foo: "aaa", bar: "bbb" };
var {x = 1, y = 2} = {x: 1} console.log(x); // 1 console.log(y); // 2
let { log, sin, cos } = Math; console.dir(Math); console.dir(sin); // let {sin} = {sin:function(){}, cos:function(){}}
let arr = [1, 2, 3]; let {0 : first, [arr.length - 1] : last} = arr; console.log(first); // 1 console.log(last); // 3
此時,字符串被轉換成了一個相似數組的對象
const [a, b, c, d, e] = 'hello'; console.log(a); // "h" console.log(b); // "e" console.log(c); // "l" console.log(d); // "l" console.log(e); // "o"
let {length : len} = 'hello'; console.log(len); // 5
let {toString: s} = 123; console.log(s === Number.prototype.toString); // true let {toString: s} = true; console.log(s === Boolean.prototype.toString); // true
function add([x, y]){ return x + y; } add([1, 2]); // 3
function add({name = "someone", age = -1} = {name:"kjf", age:"22"}) { return [name, age]; } console.log(add({name:"Jack", age:"31"})); // ["Jack", "31"] console.log(add({name:"Rose", age:"21"})); // ["Rose", "21"] console.log(add({})); // ["someone", -1] console.log(add()); // ["kjf", "22"]
function person([name="someone", age=-1] = ["kjf", 22]) { return name + " : " +age; } console.log(person(["Jack", 30])); // 'Jack : 30' console.log(person(["Rose"])); // 'Rose : -1' console.log(person([])); // 'someone : -1' console.log(person()); // 'kjf : 22'
應用:
let x = 1; let y = 2; [x, y] = [y, x];
let jsonData = { " id": 42, "status": "OK", "data": [867, 5309] }; let { id, status, data: number } = jsonData; console.log(id, status, number); // 42, "OK", [867, 5309]
如此遍歷 for(let [key, value] of map){}
任何部署了 Iterator 接口的對象,均可以用 for...of
循環遍歷
// 獲取鍵名 for (let [key] of map) { // ... } // 獲取鍵值 for (let [,value] of map) { // ... }