iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 11
0

今天筆記是昨天內容的衍生

開發者用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


上一篇
Day10 存在與布林
下一篇
Day12 物件與點
系列文
JavaScript基礎二三事30

尚未有邦友留言

立即登入留言