<commit_before>## ES6篇 - Default Parameters(預設傳入參數)

本章的目標是提供ES6中在函式中的預設傳入參數的一些介紹。預設傳入參數是在眾多ES6新特性中的其中一個，它改善了長期以來在JavaScript中都要使用技巧性的作法來設定函式傳入參數的預設值的語法。

函式的傳入參數是是函式與外部環境溝通的管道，也就是輸入資料的部份。

不過，你可能會在函式的"傳入參數"常會看到兩個不同的英文字詞，一個是parameter(或簡寫為param)，另一個是argument，這常常會造成混淆，它們的差異在於:

- parameters: 指的是在函式的那些傳入參數名稱的定義。我們在文章中會以"傳入參數定義名稱"來說明。
- arguments: 指的是當函式被呼叫時，傳入到函式中真正的那些值。我們在文章中會以"實際傳入參數值"來說明。

## 之前的預設傳入參數怎麼作

你可能會看到書上或教學文章上，告訴你函式的預設傳入參數是像下面這樣的程式碼範例:

```js
//用邏輯或符號(||)
const link = function (point, url) {
    let point = point || 10
    let url = url || 'http://google.com'
    ...
}

//另一種設定的方式，typeof是回傳類型的字串值
const link = function (point, url) {
    let point = typeof point !== 'undefined' ? point : 10
    let url = typeof url !== 'undefined' ? url : 'http://google.com'
    ...
}
```

函式的傳入參數預設值，在未指定實際的傳入值時，一定是`undefined`，這與變數宣告後但沒有指定值很相似。而且在函式定義時，我們並沒有辦法直接限定傳入參數的資料類型，所以在函式內的語句部份，一開始都會進行實際傳入參數值的資料類型檢查。所以會使用`typeof`的回傳值來判斷是否為`undefined`，或是用邏輯或(||)運算符的預設值設定方式。

使用邏輯或符號(||)的容易造成初學者混亂，這也是一個常在討論區中看到的問題。這是因為因為JavaScript採用了與其他程式語言不同的邏輯運算的回傳值設計，我們把這兩個運算符，指的是邏輯或(||)以及邏輯與(\&\&))稱為"[短路求值(Short-circuit)](https://en.wikipedia.org/wiki/Short-circuit_evaluation)"的運算符。在經過邏輯與(\&\&)以及邏輯或(||)的運算後，它的回傳值是 - **最後的值(Last value)**，並不是像在其他常見程式語言例如Java、C++、PHP中的是布林值。
<commit_msg>update published<commit_after>## ES6篇 - Default Parameters(預設傳入參數)

![intro](https://raw.githubusercontent.com/eyesofkids/ironman2017/master/day07_es6_default_param/asset/intro.png)

本章的目標是提供ES6中在函式中的預設傳入參數的一些介紹。預設傳入參數是在眾多ES6新特性中的其中一個，它改善了長期以來在JavaScript中都要使用技巧性的作法來設定函式傳入參數的預設值的語法。

> 註: 本文章同步放置於[Github庫的這裡](https://github.com/eyesofkids/ironman2017/tree/master/day07_es6_default_param)。

函式的傳入參數是是函式與外部環境溝通的管道，也就是輸入資料的部份。不過，你可能會在函式的"傳入參數"常會看到兩個不同的英文字詞，一個是parameter(或簡寫為param)，另一個是argument，這常常會造成混淆，它們的差異在於:

- parameters: 指的是在函式的那些傳入參數名稱的定義。我們在文章中會以"傳入參數定義名稱"來說明。
- arguments: 指的是當函式被呼叫時，傳入到函式中真正的那些值。我們在文章中會以"實際傳入參數值"來說明。

> 註: 函式中有個隱藏的物件也叫`arguments`這個名稱，所以它是捕捉到所有傳入到函式裡面的所有值的一個物件。

## 之前的預設傳入參數怎麼作

你可能會看到書上或教學文章上，告訴你函式的預設傳入參數是像下面這樣的程式碼範例:

```js
//用邏輯或符號(||)
const link = function (point, url) {
    let point = point || 10
    let url = url || 'http://google.com'
    ...
}

//另一種設定的方式，typeof是回傳類型的字串值
const link = function (point, url) {
    let point = typeof point !== 'undefined' ? point : 10
    let url = typeof url !== 'undefined' ? url : 'http://google.com'
    ...
}
```

函式的傳入參數預設值，在未指定實際的傳入值時，一定是`undefined`，這與變數宣告後但沒有指定值很相似。而且在函式定義時，我們並沒有辦法直接限定傳入參數的資料類型，所以在函式內的語句部份，一開始都會進行實際傳入參數值的資料類型檢查。所以會使用`typeof`的回傳值來判斷是否為`undefined`，或是用邏輯或(||)運算符的預設值設定方式。

使用邏輯或符號(||)的容易造成初學者混亂，這也是一個常在討論區中看到的問題。這是因為因為JavaScript採用了與其他程式語言不同的邏輯運算的回傳值設計，我們把這兩個運算符，指的是邏輯或(||)以及邏輯與(\&\&))稱為"[短路求值(Short-circuit)](https://en.wikipedia.org/wiki/Short-circuit_evaluation)"的運算符。在經過邏輯與(\&\&)以及邏輯或(||)的運算後，它的回傳值是 - **最後的值(Last value)**，並不是像在其他常見程式語言例如Java、C++、PHP中的是布林值。

{'fraction_non_alphanumeric': 0.14685067232837934, 'fraction_numerical': 0.009907997169143666, 'mean_word_length': 7.917981072555205, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 5, 'https://': 4, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1190270', 'n_tokens_mistral': 2062, 'n_tokens_neox': 2387, 'n_words': 109}