ES6(二)解構賦值詳解


詳解一下之前的解構賦值

  ①解構賦值中的“...”

let [a,...b]= [1];     
b // [] ...代表變量b去匹配剩余的所有元素返回一個數組 ,匹配不到時返回[]
//注意:"...b"只能放在最后

  ②解構賦值的等號兩邊的數據類型必須一樣

即:

let [] = [] 或者 let {} = {}

但是:Set結構也允許使用數組進行解構賦值 

let [a,b]= new Set([1,2,3,4])
a  //1
b  //2

技巧: 如果你不確定該結構是否能夠解構賦值,判斷其是否有Iterator接口就可以啦!判斷方法如下:

function* fibs() {
  var x= 0;
  var y= 1;
  while (true) {
    yield x;
    [x, y] = [y, x+ y];
  }
}

var [a, b, c, d, e, f] = fibs();
f// 5
//   fibs是一個Generator函數,原生具有Iterator接口。解構賦值會依次從這個接口獲取值。

 

  ③解構賦值不僅適用於 let / const也適用於var指令

  ④解構賦值允許添加默認值

let [a = 4] = [] 
a //4

  (解構賦值的匹配模式是===)注:如果解構賦值不嚴格等於 undefined 的話默認值不會生效

let [a = 4]=[undefined]
a //4
let [b = 4]=[null]
b//null

  ⑤我自己犯過的錯

let [x = y, y = 1] = [];     //報錯  因為x=y時y還沒有被聲明    不會被提升!!! 牢記
var [a = b, b = 1] = []; // a===undefined b === 1

 對象的解構賦值

  ①對象不像數組那樣有順序所以,對象的解構賦值是按照‘鍵’的方式匹配的

var { foo: baz } = { foo: 'aaa', bar: 'bbb' };
baz //  'aaa'      foo是匹配模式  baz是變量

  ②對象和數組的嵌套    如果看明白一下例子也就差不多了

var obj = {
  p: [
    'Hello',
    { y: 'World' }
  ]
};

var { p: [x, { y }] } = obj;      //p是匹配模式  [x , { y }]是值   然后再看數組中的每一項
x // "Hello" 
y // "World"

  ③不像數組那樣不存在時返回undefined  對象是會報錯的

字符串的解構賦值

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

let {length : len} = 'hello'; len // 5 匹配的是字符串的length屬性

干貨:用途

(1)交換變量的值 

[a,b]=[b,a]

(2)從函數返回多個值

function example() {
  return [1, 2, 3];
}
var [a, b, c] = example();

(3)函數參數的定義

function f([x, y, z]) { ... }
f([1, 2, 3]);

(4)提取JSON數據

var jsonData = {
  id: 42,
  status: "OK",
  data: [867, 5309]
};

let { id, status, data: number } = jsonData;

(5)函數參數的默認值

function f([x = 1, y = 2 , z]) { ... }

(6)遍歷Map結構

var map = new Map();
map.set('first', 'hello');
map.set('second', 'world');

for (let [key, value] of map) {
  console.log(key + " is " + value);
}
// first is hello
// second is world

// 獲取鍵名 for (let [key] of map) {  // ... }  // 獲取鍵值 for (let [,value] of map) {  // ... }
 

 

(7)輸入模塊的指定方法

const { SourceMapConsumer, SourceNode } = require("source-map");

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM