從前我們對變數賦值時,都是通過賦值運算子,右邊賦值給左邊這樣操作的。
let a = 1;
let b = 2;
let c = 3;
let obj = {};
obj.name = 'mm';
obj.age = 18;
現在我們通過模式匹配的方式來賦值。
左邊是解構目標,右邊是解構源。
左右結構要保持一致。
陣列的解構是有順序的,是一一對應的。(等號右邊直接寫陣列的變數名也可以。)
let [a,b,c] = [1,2,3];
console.log(a,b,c);
let arr = [4,5,6];
let [x,y,z] = arr;
只要右邊的模式和左邊相同,那麼左邊對應的變數就會被賦予對應的值。
let [a,[b,[c,d]],e] = [1,[2,[3,4]],5];
console.log(a,b,c,d,e);
如果右邊沒有給值,就當做undefined處理。
let [a,b,c] = [1,2]; // let [a,b,c] = [1,2,undefined];
let [a, , b] = [1,2,3];
語法:...變數名
作用:可以將右邊陣列中剩餘的值解構到左邊,而且是以陣列的形式儲存。
let [a, ...b] = [1,2,3,4,5,6];
console.log('a為:', a);
console.log('b為:', b);
剩餘運算子只能放在最後乙個引數的位置上,否則報錯。
let [...b, a] = [1,2,3];
console.log(b);
指定預設值,預設值產生的條件是:右邊陣列中對應的資料(====)嚴格等於undefined。
例如下面,y=10
就表示,y的預設值為10。
let [x,y=10] = [1]; // let [x,y=10] = [1, undefined];
console.log(x,y);
let [a=10, b=a] = ; // a=10,b=10
let [a=10, b=a] = [1]; // a=1, b=1
let [a=10, b=a] = [1,2]; // a=1, b=2
let [a=b, b=20] = ; // 報錯(在用b之前還沒初始化值)
分析:
第一行:a和b匹配到undefined,所以採用預設值,a是10,b的值是a,也就是10;
第二行:a匹配到1,b匹配到undefined,所以b的值就是a,也就是1;
第三行:a和b均匹配到數值,因此a為1,b為2;(這裡b不會是預設給到a的值,因為它自己有匹配的值)
第四行:a=b,但是b還沒有初始化,因此報錯。
只有左邊物件的變數名和右邊物件的屬性名相同時,才會取到值。(等號右邊寫物件的變數名也可以。)
let = ; // a='foo' b='bar'
let obj =
let = obj; // name='mm' age=18
let = ; // say='undefined' (找不到對應的屬性名,那就給undefined)
let obj = ] };
let ] } = obj; // x='hello' y='world'
左邊:p是一種模式匹配,真正解構的是後面的陣列中的x和物件中的y。
因此按照陣列解構'hello'賦值給x,按照物件解構'world'賦值給y。
那麼要想獲取物件中p的屬性值呢,直接寫p就行。
let = obj; // p=['hello', ]
let = ; // a=1 b=2 c=undefined
let obj = ] };
let ] } = obj; // x='hello'
剩下的屬性以物件的形式保留。
let = ; // a=1 b=2 res=
指定預設值,預設值產生的條件是:物件屬性名(====)嚴格等於undefined。
let = ; // a=1 b=10 c=undefined
let = ; // x=3
let = ; // y=null
物件的解構賦值的內部機制,是先找到同名屬性,然後再賦給對應的變數。真正被賦值的是後者,而不是前者。
例如,等號左邊foo對應右邊的同名屬性是foo,它的值是'foo',這個值最後賦值給foo對應的變數f而非foo。
簡而言之,這個f和b相當於是乙個別名。
let = ; // f='foo' b='bar'
let x=1, y=2;
[x, y] = [y, x];
console.log(x,y); // 2 1
function foo()
let [a,b,c] = foo();
console.log(a,b,c); // 1 2 3
function bar()
}let = bar();
console.log(b1, b2); // 'bar1' 'bar2'
var json =
let = json;
console.log(name, age); // 'mm' 18 '暫無資料'
匯出模組時用export,匯入模組時用import。
模組匯出:(檔名為:module.js)
let [a,b,c] = [1,'second',true];
export
模組匯入:
import from './module.js';
console.log(a,b,c); // 1,'second',true
等號左右結構和形式要對應;
陣列解構賦值時,左邊變數的順序和右邊變數值的順序是一一對應的;物件結構賦值時,左右兩側的順序不重要,只要找到就行;
如果左邊沒有匹配到右邊的值,那麼當做undefined處理,把undefined賦值給左邊;
剩餘運算子要放在引數末尾的位置上,如果是陣列,那麼會以陣列的形式賦值給左邊的變數,如果是物件,則以物件形式賦值。
預設值生效的前提是,右邊對應陣列位置或者物件屬性名的資料嚴格等於undefined。(===)
用途:ajax後台大量的json資料傳遞到瀏覽器客戶端,用解構賦值可以方便地獲取資料。
用途:功能模組匯入。
ES6中解構賦值
理解 解構賦值就是從目標物件或陣列中提取自己想要的變數。最常用的場景是 element ui 或 vant ui 按需引入,請求介面返回想要的資料。陣列解構 乙個蘿蔔乙個坑,按照順序進行 var a,b,c 12,13 a,b 這個寫法報錯 invalid destructuring assignm...
ES6 解構賦值
陣列的解構賦值 let a,b 12,13 let a,b,c d 13,15,16 let a,b c 78,12 23 let x,y 1,3,5 x 1,y 3 let x,y,z a x a,y undefined z let h,b 1,2,3,4 1,2,3,4 預設值 let x tr...
ES6解構賦值
一 基本用法 解構 destructuring 按照一定的模式,從陣列或者物件中提取值,對變數進行賦值。let par1,par2,par3 1,2 console.log par1,par2,par3 1 2 不完全解構時par3對值為undefined 解構賦值允許指定變數對預設值。let pa...