Sign in

JavaScript: Currying & Coercion (型別強制轉換)

前言

以範例理解 Currying 觀念和屬於弱型別 JavaScript型別強制轉換特性。

Currying

Currying is an advanced technique of working with functions. It’s used not only in JavaScript, but in other languages as well.

Currying is a transformation of functions that translates a function from callable as f(a, b, c) into callable as f(a)(b)(c).

Currying doesn’t call a function. It just transforms it.

範例 1:

說明:(1) 資料傳遞方式、(2) 參數 x 和 y 值變化

  1. 命名 add5 = makeAdder(5),函式 makeAdder(x)的參數 x,固定代入
    5 後, 繼續執行inner func-return function(y)。
    但 inner func的return function(y) 只有參數 y,沒有 x,所以只會計算 x。

範例 2 (承範例 1 ):
嘗試寫一組 add 函式,分別使 add(a, b) 和 add(a)(b) 回傳同樣結果,例如:
add(1, 2); // 3
add(1)(2); // 3

  1. Currying 觀念函式為基礎,建立 add 函式。

範例 2 出現 Bug:add(2, 0) !== add(2)(0)

console.log(“add(2, 0)”, add(2, 0))
console.log(“add(2)(0)”, add(2)(0))

Debug:流程斷點Step1、Step2 設console.log,測試:

  1. 若代入add(-1, 1)、add(0, 1)等參數,皆正常。

Bug 原因:
參數 0 代入if(x, y),若 if 條件式內有 0,被 JavaScript 型別轉換成 False
因 Javascript 為弱型別語言,即型別之間比較會強制轉型

修改方式:

將 if 條件式修改為更精確表達,將 if(x, y) 改為 if((typeof x ===”number”) && (typeof y ===”number”))強制限定參數 x 和 y 的型別必須同時為 number

修改後:

Equipped with web development, communication, and business analytical skills.