今天筆記是昨天內容的衍生
開發者用JS程式呼叫函式時,傳參數進去處理是很常見的方式,如果呼叫時沒有帶入參數,會發生什麼事呢?
來看看以下程式碼:
function greet(name){
console.log('Hello ' + name);
}
greet()
結果是:
發生了什麼事?
我們沒有帶值進去,JS在呼叫函式時也沒報錯,因為傳入的值在呼叫階段被設定進記憶體,但我們什麼都沒有傳,所以JS把這個空的東西,在記憶體被設定成undefined
並傳入。
當undefined
與字串相加時被轉型成字串'undefined'
,自然印出'Hello undefined'
囉!
但是這並不符合開發者預期的狀況,有沒有辦法讓我們呼叫函式,在未帶入值的時後,函式內有個預設值存在嗎?
這個時候可以使用昨天筆記的方法。
function greet(name){
name = name || '<Your name here>';
console.log('Hello ' + name);
}
greet();
利用了先前提到,||
運算子與型別轉換的特性,在JS自動型轉時,undefined
會被轉成false
,而有值的東西會被轉為true
,||
運算子可以想成中文「或」,當||
運算子左邊的東西成立時(被轉型為true
),左相依性的||
運算子就不會去處理右邊的東西(因為已經找到true
了),若||
左邊是false
,才去檢查右邊是不是true
。
例如:
拉回greet這個函式,利用此一特性,若是呼叫函式沒帶值,此時帶入的是undefined
name = name || '<Your name here>';
變成
name = undefined || '<Your name here>';
當undefined
與有值(且非null
、''
、false
)的東西比就會是
name = undefined(false) || true
||
運算子會選擇true
結果就是:
若我們呼叫函式時有帶值
greet('Tony');
此時函式內的運作變成這樣
name = 'Tony' || '<Your name here>';
||
運算子先看左邊的東西,左邊一判斷為true
就回傳(不往右邊看),因此會賦值的是'Tony'
,而不是'<Your name here>'
。
也就是說用這種方法,開發者可以在不影響結果的狀況,讓JS函式內有有預設值,不管有沒有帶值進去,都不會被undefined
影響呼叫函式的結果。
小結
與昨天筆記內容相似,使用||
與JS自動轉換型別的特性,可以做出預設值的效果,這種方式通常會在JS函式庫、別人寫好的Plugin看見,有時也挺有妙用。
鐵人賽一轉眼就進入第11天,剛好課程第三章節也在這邊告一段落,明天進入第四章節物件的部分,這部分也是影片最多、最重要的,加油加油。
今天的筆記內容可以參照Udemy課程:JavaScript 全攻略:克服JS 的奇怪部分3-28