js中實現單分派泛函式

2021-09-24 07:55:59 字數 2520 閱讀 1867

有這樣乙個函式,我們根據傳入的第乙個引數型別不同,以不同方式執行相同操作(單分派泛函式), 我們來看乙個簡單的例子:

function

show(value) else

if(value instanceof

date) else

if (value instanceof

number || value instanceof

boolean) else

}複製**

這個例子比較簡單,每乙個if後面只有一行**,然而在實際工作中,也許每乙個if後面都有一段邏輯複雜邏輯複雜的**,我們通常的處理方式就是將其拆分出來作為乙個新的函式,然後在if裡面呼叫,現在我向大家介紹一種新的方法來出來這種情況。

我們先來看看使用方式:

const show = singledispatch(vlaue =>

console.log(value));

show

.dispatch(value =>

console.log(value * value))

.register(number)

.register(boolean);

.dispatch(value =>

console.log(value * 1))

.register(date);

.dispatch(value =>

console.log(value.join('-')))

.register(array);

show(2); // 4

show(true); // 1

show([3, 4, 5]) // 3-4-5

show(new

date()) // 1542177163659

show() // [object object]

複製**

singledispatch接受乙個函式,返回乙個函式物件showshow先dispatch乙個函式,之後註冊乙個number和boolean,表示show傳入的引數如果是數字或者布林型別,就呼叫dispatch的這個函式,之後也是這樣。

singledispatch需要返回乙個函式物件,我們假設叫out,這個函式物件有兩個方法分別為dispatchregister,鏈式呼叫就需要返回out;具體實現過程如下,

function

singledispatch(fn /* 預設是乙個空函式*/ = function.prototype) ; // 乙個物件,用於儲存某個型別下對應呼叫的函式

function

out(arg) else

}out.dispatch = function

dispatch(f)

current = f;

return out;

}out.register = function

register(ctor)

registry[`[object $]`] = current;

return out

}return out;

}複製**

有的時候,我們並不是根據型別做判斷,我們希望可以自定義的方式去判斷,因此,register可以傳入乙個函式,用這個函式去做判斷,就像下面這個樣子:

const f = singledispatch();

f .dispatch(v => v * v * v).register(v => v > 10)

.dispatch(v => v * v).register(v => v <= 10);

f(11) // 1331

f(5) // 25

複製**

此時的singledispatch需要修改registerout

function

singledispatch(fn = function.prototype) else

}out.dispatch = function

dispatch(f)

current = f;

return out;

}out.register = function

register(condition)

if(typeof condition !== 'function')

conditions.push(condition);

registry.push(current);

return out

}return out;

}複製**

用泛型實現單鏈表

節點 public class entry public t getvalue public void setvalue t value public entry getnext public void setnext entry next 頭節點 public class headentry ex...

js 實現單鏈表

最近在 leetcode 刷題時發現需要用到鍊錶,但是 js 中沒有鍊錶這種資料型別,故自己實現乙個簡單的單鏈表。先科普一下鍊錶 鍊錶是一種物理儲存單元上非連續 非順序的儲存結構,資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。鍊錶由一系列結點 鍊錶中每乙個元素稱為結點 組成,結點可以在執行時動...

js函式實現

call實現 思路 將要改變this指向的方法掛到目標this上執行並返回 function.prototype.mycall function context context context window context.fn this let arg arguments slice 1 let ...