結構賦值是es6 中增加的非常實用的新功能,能提高我們的編碼效率。但是,有時候在函式引數中用時,常常會出錯,例如下面
eg1:
function foo( ={})console.log(foo());//
[6, 8]
console.log(foo());//
[6, 0]
console.log(foo({}));//
[0, 0]
console.log(foo());//
[0, 0]
如果我們把上述例子改成下面
eg2:
function foo( = )console.log(foo()); //
[6, 8]
console.log(foo()); //
[6, undefined]
console.log(foo({})); //
[undefined, undefined]
console.log(foo()); //
[0, 0]
結果是不是超出你的想象!
查閱資料後才發現,其實是這樣的:
eg1 是給變數x,y指定預設值,eg2 是給函式的引數指定預設值。
首先,簡單說明一下基本的物件解構賦值操作中解構賦值預設值的使用:
let = ;console.log(x);//6
console.log(y);//
9
在簡單的解構賦值操作中,等號左邊的物件是變數組成的,我在這裡稱它左變數(為了後文方便理解,姑且這樣定義)即:x,y,等號右邊的部分是真正的值,這裡稱它為右真值;而左變數中x,y等號右邊的部分分別為變數x和變數y的預設值。它們之間的關係是:當右側x,y沒有指定值的時候(也就是x===undefined和y===undefined的時候),變數的預設值會生效,而當x,y指定了值的時候,變數的預設值不會生效。那麼什麼是衡量x,y是否===undefined的標準呢?可以是以下幾種情況:
1.右側沒有對應的屬性let = ;//
這種情況下屬性x就是undefined,那麼此時變數的預設值生效,所以輸出:x為0,y為9
2.右側屬性值就是undefined
let = ;
值得特別說明的是:這裡判斷預設值是否生效的是右真值是否===undefined,而不是==undefined,兩者有什麼區別呢?在js中undefined==null是成立的,而undefined===null是不成立的。關於這一點可以通過在瀏覽器中輸入下面的**驗證:
console.log(undefined===null);//false
console.log(undefined==null);//
true
所以,這裡得到這樣的結論:
let = ;console.log(x);
//null
console.log(y);//
9
也就是說,undefined===null是false,所以預設值不能生效,所以最終結果是null。
現在,再說明一下函式引數預設值,如下:
function fun(a = 0)fun();
//這裡函式呼叫時,沒有傳實參,所以預設值0生效;
fun(6);//
這裡傳遞了實參,所以實參是6;
所以,函式引數預設值生效的標準是函式呼叫時沒有傳遞實參;
那麼我們再來分析一下上面的兩個例子:
eg1:
function foo( ={})console.log(foo());//
[6, 8]
//說明:傳遞了實參,所以函式預設值{}不生效,對實參解構賦值,對應的屬性都有值,所以解構賦值的預設值不生效,所以x = 6,y = 8;
console.log(foo());//
[6, 0]
//說明:傳遞了實參,所以函式預設值{}不生效,對實參解構賦值,對應的屬性x有值,y沒有值,所以解構賦值的預設值y生效,x不生效,所以x = 6,y = 0;
console.log(foo({}));
//[0, 0]
//說明:傳遞了實參{},所以函式預設值{}不生效,對實參{}解構賦值,對應的屬性都沒有值,所以解構賦值的預設值生效,所以x = 0,y = 0;
console.log(foo());
//[0, 0]
//說明:沒有傳遞實參,所以函式預設值{}生效,對實參{}解構賦值,對應的屬性都沒有值,所以解構賦值的預設值生效,所以x = 0,y = 0;
eg2:
function foo( = )console.log(foo()); //
[6, 8]
//說明:傳遞了實參,所以函式預設值不生效,對實參解構賦值,對應的屬性都有值,所以解構賦值的預設值不生效,所以x = 6,y = 8;
console.log(foo()); //
[6, undefined]
//說明:傳遞了實參,所以函式預設值不生效,對實參解構賦值,對應的屬性x有值,y沒有值,所以x=6,因為本例沒有解構賦值的預設值,所以y就是undefined;
console.log(foo({})); //
[undefined, undefined]
//說明:傳遞了實參{},所以函式預設值不生效,對實參{}解構賦值,對應的屬性沒有值,所以x,y就是undefined;
console.log(foo()); //
[0, 0]
//說明:沒有傳遞實參,所以函式預設值生效,對實參解構賦值,對應的屬性有值,所以x,y就是0;
這樣分析下來是不是就容易理解多了,以上是查閱資料後的個人拙見,如有不妥處,請指正,謝謝!
從賦值操作理解不同型別的函式傳參
從賦值操作理解不同型別的函式傳參 我們都知道所謂的程式,就是對傳入的資料進行操作,最終將處理的資料輸出給使用者。那麼在我們的程式設計中的體現,就是通過函式 或者方法 引數傳入資料,然後通過函式返回值輸出處理後的資料。資料的傳入涉及到函式的實參和形參的傳遞,資料的輸出涉及到函式的返回值和返回值型別的引...
從賦值操作理解不同型別的函式傳參
從賦值操作理解不同型別的函式傳參 我們都知道所謂的程式,就是對傳入的資料進行操作,最終將處理的資料輸出給使用者。那麼在我們的程式設計中的體現,就是通過函式 或者方法 引數傳入資料,然後通過函式返回值輸出處理後的資料。資料的傳入涉及到函式的實參和形參的傳遞,資料的輸出涉及到函式的返回值和返回值型別的引...
你真的理解Python中的賦值 傳參嗎?
在學習程式設計的過程我們都會遇到很多定義,之前在遇到這些定義的時候,我有一種強迫症。就是不搞清楚每乙個字的含義,不善罷甘休。但是每次都會盡興而來,失望而歸。多次之後我學乖了,就是不糾結實際每乙個字的含義,用自己能懂的方式理解他們,比如今天要說的引用傳遞和值傳遞 官方的定義是這樣的 值傳遞 引用傳遞 ...