解構賦值運用到函數參數上,減少了一些操作同時也增加了一些麻煩.
1.函數參數
let a={name:'小明',age:18}
function wuKongYouLook(b){
console.log(b)
}
wuKongYouLook(a)//{name:'小明',age:18}
wuKongYouLook() //undefined
我們可以理解成函數在聲明的時候,如果有一個形參b,則在調用的時候聲明了一個局部變量b,所以即使沒有傳參,也只是沒有值,即undefined.
而傳實參,則相當於又多了個b=a這個賦值的過程,所以函數后續的代碼雖然使用變量b,但實際在操作a的值.這一點在vue項目中涉及雙向綁定時會有明顯感受
2.形參默認值
let a={name:'小明',age:18}
function wuKongYouLook(b={}){
console.log(b)
}
wuKongYouLook(a)//{name:'小明',age:18}
wuKongYouLook() //{}
也就是說,當b=a這一步失敗時,則b取其默認值.這一點很重要
3.函數參數解構賦值
let a={name:'小明',age:18}
function wuKongYouLook({name,age}){
console.log(name,age)
}
wuKongYouLook(a)//小明,18
wuKongYouLook() //報錯
//這里實際上是省略了一步,let {name,age} =a;即 let 形參 = 實參,所以就可以打印出name,age的值.而不給參數或者參數是undefined時,let {name,age}=null或者undefined都會報錯
故,我們需要給個默認值
let a={name:'小明',age:18}
function wuKongYouLook({name,age}={}){
console.log(name,age)
}
wuKongYouLook(a)//小明,18
wuKongYouLook() //undefined,undefined
//同理,當let {name,age} =null或者undefined時,系統要報錯,但是這時它發現參數有默認值,於是就變成了let {name,age} = {},空對象是可能有name屬性的,那就沒錯,去找找看,沒有,那就返回undefind.
設置幾種默認值的陷阱,很容易出錯
(1)形參整體設置默認值
上面那個例子就是,在等號的右邊設置想要的默認值
let a={name:'小明',age:18}
function wuKongYouLook({name,age}={name:'shyno',age:18}){
console.log(name,age)
}
wuKongYouLook(a)//小明,18 let {name,age}={name:'小明',age:18}
wuKongYouLook({name:'小紅'}) //小紅,undefinded let {name,age} = {name:'小紅'}
wuKongYouLook({}) //undefined,undefined let {name,age} = {}
wuKongYouLook() //shyno,18 let {name,age} = {name:'shyno',age:18}
原理還是一樣,先看看有沒有實參.除了最后一次調用,都有實參.所以,只有最后一次打印了默認值,即{name:'shyno',age:18}.其他的都是解構了實參
(2)形參解構賦值時設置默認值
let a={name:'小明',age:18}
function wuKongYouLook({name='shyno',age=17}={}){
console.log(name,age)
}
wuKongYouLook(a)//小明,18 let {name='shyno',age=17} = {name:'小明',age:18}
wuKongYouLook({name:'小紅'}) //小紅,17 let {name='shyno',age=17} = {name:'小紅'}
wuKongYouLook({}) //shyno,17 let {name='shyno',age=17} = {}
wuKongYouLook() //shyno,17 let {name='shyno',age=17} = null或者undefined
