摘要:實現什么是柯里化又稱部分求值,簡單來說就是只傳遞給函數一部分參數來調用它,讓它返回一個函數去處理剩下的參數。你可以這樣正規寫當然用柯里化也可以這樣定義一個函數,接受一個參數并返回一個新的函數。
實現add(1)(2)(3) 什么是柯里化(Currying)
又稱部分求值(Partial Evaluation),簡單來說就是只傳遞給函數一部分參數來調用它,讓它返回一個函數去處理剩下的參數。
你可以這樣正規寫
var sum = function (a, b) { return a + b; }
當然用柯里化也可以這樣
var sumCurrying = function(a) { return function(b) { return a + b; } } var first = sum(1); //function var second = sum(2); //function sumCurrying(1)(2); //3 first(3); //4 second(4); //6
定義一個sumCurrying函數,接受一個參數并返回一個新的函數。調用sumCurrying函數之后,返回的函數就通過閉包的方式記住了sumCurrying的第一個參數。
但是這里只能接受兩個參數,如果能接受很多個參數怎么辦呢?
柯里化的運用function add () { var args = [].slice.call(arguments); var fn = function () { var arg_fn = [].slice.call(arguments); return add.apply(null, args.concat(arg_fn)); } fn.valueOf = function() { return args.reduce((a, b) => a + b); } return fn; }
我第一次看這個代碼的時候我也是納悶,what the fuck??valueOf是什么鬼?它運行了嗎?看了原博主的我才明白了原來valueOf和toString在某些時候是會自己調用的,還牽扯到了類型轉換,啊啊啊啊~。
來看看這個類型轉換的題
2 == [[[2]]] //是真還是假?
解析:
引用類型轉換為基本類型(所有的引用類型轉換為布爾值都是true)
引用類型轉換為字符串
1.優先調用toString方法(如果有),看其返回結果是否是原始類型,如果是,轉化為字符串,返回。
2.否則,調用valueOf方法(如果有),看其返回結果是否是原始類型,如果是,轉化為字符串,返回。
3.其他報錯。
引用類型轉化為數字
1.優先調用valueOf方法(如果有),看其返回結果是否是原始類型,如果是,轉化為數字,返回。
2.否則,調用toString方法(如果有),看其返回結果是否是原始類型,如果是,轉化為數字,返回。
3.其他報錯。
以下來自犀牛書:
1,null和undefined,相等。
2,數字和字符串,轉化為數字再比較。
3,如果有true或false,轉換為1或0,再比較。
4,如果有引用類型,優先調用valueOf。
5,其余都不相等。
回到類型轉換的這個題,因為是與數字進行比較,所以先調用valueOf(),返回的是本身不是原始類型,然后調用toString()得到"2",然后變成了字符串和數字("2" == 2)進行比較。
所以結果為 true
好,回到valueOf和toString被自動調用的問題上。
var obj = {name: "Coco"}; var str = "123" + obj; console.log(str); //123[object Object]
為什么會這樣呢?上面的例子實際上是
var obj = {name: "Coco"}; var str = "123" + obj.toString();
當然我們可以改寫toString和valueOf方法
如果只改寫 valueOf() 或是 toString()其中一個,會優先調用被改寫了的方法,而如果兩個同時改寫,則會像 Number 類型轉換規則一樣,優先查詢 valueOf() 方法,在 valueOf() 方法返回的是非原始類型的情況下再查詢 toString() 方法。
var obj = { toString: function () { console.log("調用了toString"); reutrn "1"; }, valueOf: function () { console.log("調用了vlaueOf"); return "100"; } } alert(obj + "1"); //調用了valueOf //"1001"
對于函數的valueOf來說:
function test () { var a = 1; console.log(a); } test; //重新打印了一遍test函數體,其實是自行調用調用了test.valueOf() //如果valueOf返回的不是原始類型,那么就會嘗試去找toString方法。
所以add(1)(2)
首先進入add
然后進入fn
然后進入add
調用valueOf
3
參考資料:
一道面試題引發的javascript類型的轉換的思考
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86816.html
摘要:集合類類型解釋的父類集集合中的元素不按特定方式排序,并且沒有重復對象。他的有些實現類能對集合中的鍵對象進行排序。 集合類 2017-07-10 22:24:57 blog site https://github.com/Fiz1994 類型解釋: Collection : Set,List 的父類 Set(集):集合中的元素不按特定方式排序,并且沒有重復對象。他的有些實現類能對集合中的...
當談到深度學習和人工智能時,TensorFlow是最受歡迎的框架之一。TensorFlow是一個開源的機器學習框架,由Google開發和維護。它允許開發人員和研究人員使用Python等編程語言來構建和訓練深度學習模型。在本文中,我們將探討TensorFlow的編程技術。 1. 安裝TensorFlow 首先,您需要安裝TensorFlow。TensorFlow可以通過pip包管理器輕松安裝。在...
如今yolov5的neck用的都是PANet,在efficient文章中給出了BiFPN結構,也有更為很不錯的特性,接下來本文關鍵為大家介紹了對于如何將yolov5里的PANet層改成BiFPN的資料,需用的小伙伴可以借鑒一下 一、Add 1.在common.py后放入如下所示編碼 #融合BiFPN設定可學習培訓主要參數學習培訓不一樣支系的權重值 #2個支系add實際操作 cl...
閱讀 2062·2023-04-25 21:11
閱讀 2963·2021-09-30 09:47
閱讀 2272·2021-09-24 09:48
閱讀 4427·2021-08-23 09:43
閱讀 895·2019-08-30 15:54
閱讀 559·2019-08-28 18:01
閱讀 1397·2019-08-27 10:55
閱讀 588·2019-08-27 10:55