let [a, b, c] = [1, 2, 3]; // 若是不是數組,則會報錯 let [e] = 5 console.log(e) // 若是左側變量名多於右側,則左側多的變量賦值不成功爲undefined let [a,b,c,d] = [2,3]; console.log(a,b,c,d) //2 3 undefined undefined // 若是左側出現展開運算符時;右側對應的值會放到一個數組中 let [a,...b] = [1,2] console.log(a,b) // 1 [2] let [c,...d] = [1,[3,4]] console.log(c,d)// 1 [[3,4]] // 若是右側的值多於左側的變量,那麼只匹配對應的值,多餘的值則不會解構 嵌套解構 let [aa,bb] = [1,[3,4],66] let [cc,[dd]] = [1,[3,4],66] console.log(aa,bb) //1 [3,4] console.log(cc,dd) //1 3 // 二、解構賦值容許指定默認值 let [a1,b1=2] = [1]; console.log(a1,b1) //1 2 // 只有左側對應的值嚴格等於undefined時,默認才生效 let [a2,b2=3]=[2,false]; let [a3,b3=3]=[2,undefined]; console.log(a2,b2); //2 false console.log(a3,b3); //2 3 // 默認值能夠引用解構賦值的其餘變量,但該變量必須已經聲明。 let [a4,b4=a4] = [3]; let [a6=1,b6=a6] = []; let [a5=b5,b5] = [3,5]; let [a7=b7,b7] = []; //ReferenceError: b7 is not defined console.log(a4,b4) //3 3 console.log(a5,b5) //3 5 console.log(a6,b6) //1 1
對象解構 是根據變量名來進行解構賦值的 沒有順序,若是左側沒有在右側找到一樣的名稱,則該變量是undefined先找到同名屬性,而後再賦給對應的變量。真正被賦值的是後者,而不是前者。因此咱們寫代碼的時候必定要注意vue
let { bar, foo } = { foo: 'aaa', bar: 'bbb' }; console.log(bar,foo) //bbb aaa let { bar, foo } = { foo: 'aaa' }; console.log(bar,foo) //undefined aaa let { bar:foo, foo:bar } = { foo: 'aaa', bar: 'bbb' }; let { foo:bar } = { foo: 'aaa', bar: 'bbb' }; console.log(bar,foo) //foo is not defined // 也能夠對內置對象進行解構 例如Math let {floor,ceil,round} = Math; console.log(floor(3.5)) //3 console.log(ceil(3.5)) //4 console.log(round(3.5)) //4 // 對象也能夠嵌套解構 let {fn,fn:{fn1}} = {fn:{fn1:3}} console.log(fn) //{fn1:3} console.log(fn1) // 3 // 對象的解構也能夠指定默認值 默認值生效的條件是,對象的屬性值嚴格等於undefined。 var {obj1 = 3} = {}; var {obj2 = 3} = {obj2:undefined}; var {obj3 = 3} = {obj3:null}; console.log(obj1,obj2,obj3) //3 3 null // 注意 不能將大括號寫在行首,JavaScript 引擎會將{obj4}理解成一個代碼塊,從而發生語法錯誤。 let obj4; // {obj4} = {obj3:5}; ({obj4} = {obj4:5}) // 能夠對數組進行對象屬性的解構 // 都有一個length屬性,所以還能夠對這個屬性解構賦值。 let {0:first,length:len} = [2,4,5] console.log(first) //2 console.log(len) //3
const [str1, str2, str3] = 'hello'; const {length}= 'hello'; console.log(str1,str2,str3,length) //h e l 5 // 只要等號右邊的值不是對象或數組,就先將其轉爲對象。因爲undefined和null沒法轉爲對象,因此對它們進行解構賦值,都會報錯。 let {toString:s} = 55 let dddd = s.toString(444) console.log(typeof dddd)
(1)、交換賦值更方便react
let x = 1; let y = 2; [x, y] = [y, x];
(2)、函數返回值,能夠直接解構對應不一樣的變量web
function example() { return { foos: 1, bars: 2 }; } let { foos, bars } = example();
(3)、函數傳參更方便 若是向函數中傳入數組或對象的話,不使用解構那咱們還須要從數組或對象中去取值;若是解構,則咱們能夠在函數中直接使用變量的值json
function f([x, y, z]) { // 這裏能夠直接使用 數組的值 1 2 3 } f([1, 2, 3]);
(4)、以快速提取 JSON 數據中有用的值 後臺接口給咱們返回的字段,咱們不必定所有都用,這是咱們能夠把用到的字段解構出來使用。數組
let jsonData = { data: [867, 5309], success:true, massage:"成功", status:200 }; let { status, data,success } = jsonData;
(5)、for...of循環遍歷 任何部署了 Iterator 接口的對象,函數
const map = new Map(); map.set('first', 'hello'); map.set('second', 'world'); for (let [key, value] of map) { console.log(key + " is " + value); }
(6)、引入模塊的時候,可使用解構來,輸出須要使用的一些方法學習
// 例如vue3 的引入 直接使用其內的函數 import { ref, reactive,readonly,toRaw } from 'vue'
歡迎關注公衆號(web學習吧),一塊兒學習進步: spa
本文使用 mdnice 排版code