解構賦值,即對某種結構進行解析,然后將解析出來的值賦值給相關的變量,常見的有數組、對象、字符串的解構賦值等;
今天是要說的是數組、對象和函數參數的解構賦值:
一、 數組的解構賦值
1.前后模式必須匹配,如果前面的聲明的是二維數組后面的數據也是二維數組
//數組的解構賦值 let [a,b,c]=[12,23,34] console.log(a,b,c) //12,23,34 let [d,[e,f],g]=[1,[2,3],4] console.log(d,e,f,g) //1,2,3,4
2.前多后少,即前面聲明的變量多,后面賦值少
所以某些變量會解構不成功,這種情況就相當於只聲明了變量未定義值,所以為undefined
let [a,b,c]=[1,2] console.log(a,b,c) //1,2,undefined
3.前少后多,即前面的變量少,后面的值多;這種情況分為兩種:
(1)省略賦值
(2)不定參數解構賦值
...是拓展運算符
//省略賦值 let [,,a]=[1,2,3]; console.log(a) // 3 //...不定參數解構賦值 let [c,...s]=[1,2,3,4]; console.log(c,s) // 1 [2, 3, 4]
4.數組解構賦值的默認值
Q1:先賦值默認值再解構賦值還是直接解構賦值不考慮默認值?
A:直接解構賦值不考慮默認值
//先賦值默認值再解構賦值還是直接解構賦值不考慮默認值? let [x, y = (function () { console.log("1111"); return 10; })()] = [45, 32] console.log(y)
Q2:什么時候會賦值為默認值?
A:當解構不成功,則前有變量,后未定義時,此時此變量的值為undefined就會走默認值;其他的情況都不是未定義
var a= null var a= [ ] 這些情況都是定義了
二、對象的解構賦值
1.變量和屬性名必須同名,才可以解構賦值、
//變量和屬性必須同名 才可以解構賦值 let {a,b}={a:"張三",b:"李四"} console.log(a,b) //張三 李四
2.解構不成功,值為undefined
let {a,b}={a:"張三"} console.log(a,b) //張三 undefined
3.如果需要變量名和屬性名不一致時
//變量名和屬性名不一致時 let {aa:A,bb:B}={aa:"張三",bb:"李四"} console.log(A,B) //張三 李四
4.對象解構賦值的默認問題
與數組解構相同,解構成功時直接賦值,不考慮默認值,解構不成功沒有值或undefined就會賦值默認值
5.對象解構賦值時需要注意
{}前必須加 let
{a}={a:"zhangsan"} ✖ let {a}={a:"zhangsan"} ✔
6.當聲明一些方法等於它的類時,就可以直接使用這個方法
let {ceil}=Math; let a=ceil(2.3); console.log(a) //3 let {log}=console; log("aaa") //aaa
三、函數參數的解構賦值
1.函數參數的默認值
function f(a=5){ //等號左邊是形參,右邊是默認值 console.log(a) } f(3) // a是形參 5是默認值 3是實參
當函數的參數解構賦值的時候要理清函數的默認參數
2.函數作用域:函數在調用的時候會形成一個私有作用域,在這個作用域下聲明的變量和參數變量外界都訪問不到
3.arguments:是函數中一個類數組參數,它是實參構成的集合
function f(a,b,c){ console.log(arguments) } f(1,2,3)
4.箭頭函數
(1)只適合用於匿名函數
// 匿名函數 let fn=function(){} //函數表達式 fn(12,function(){ }) // 回調函數
除了用function 聲明的有名函數 剩下的都是匿名函數
(2)箭頭函數的寫法
let fn =(變量)=>{代碼}
每個箭頭函數結束的時候一定要return
(3)當只有一個變量的時候可以省略()
let fn=x=>{return x;}
(4)當只有一行代碼,且這行代碼是return xxx;時,可以省略{}和return
let fn=x=>x;
(5)箭頭函數的優勢:箭頭函數沒有this指向,只指向他的父級作用域
(6)箭頭函數獲取實參,不能使用arguments,需要用...arg
let fn=(...arg)=>{ console.log(arg) } fn(1,2,3)
(7)箭頭函數不能定義類函數:因為箭頭函數中的this指向父級作用域,而類中的this指向實例對象