有關函式傳參的結構賦值的理解

2022-08-28 14:03:26 字數 2954 閱讀 3224

結構賦值是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中的賦值 傳參嗎?

在學習程式設計的過程我們都會遇到很多定義,之前在遇到這些定義的時候,我有一種強迫症。就是不搞清楚每乙個字的含義,不善罷甘休。但是每次都會盡興而來,失望而歸。多次之後我學乖了,就是不糾結實際每乙個字的含義,用自己能懂的方式理解他們,比如今天要說的引用傳遞和值傳遞 官方的定義是這樣的 值傳遞 引用傳遞 ...