日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

如何用JavaScript實現一個數組惰性求值庫

瀏覽:22日期:2023-06-04 16:02:50
概述

在編程語言理論中,惰性求值(英語:Lazy Evaluation),又譯為惰性計算、懶惰求值,也稱為傳需求調用(call-by-need),是一個計算機編程中的一個概念,它的目的是要最小化計算機要做的工作。它有兩個相關而又有區別的含意,可以表示為“延遲求值”和“最小化求值”,除可以得到性能的提升外,惰性計算的最重要的好處是它可以構造一個無限的數據類型。

看到函數式語言里面的惰性求值,想自己用JavaScript寫一個最簡實現,加深對惰性求值了解。用了兩種方法,都不到 80 行實現了基本的數組的惰性求值。

怎么實現

惰性求值每次求值的時候并不是返回數值,而是返回一個包含計算參數的求值函數,每次到了要使用值得時候,才會進行計算。

如何用JavaScript實現一個數組惰性求值庫

當有多個惰性操作的時候,構成一個求值函數鏈,每次求值的時候,每個求值函數都向上一個求值函數求值,返回一個值。最后當計算函數終止的時候,返回一個終止值。

如何用JavaScript實現一個數組惰性求值庫

具體實現判斷求值函數終止

每次求值函數都會返回各種數據,所以得使用一個獨一無二的值來作為判斷流是否完成的標志。剛好 Symbol() 可以創建一個新的 symbol ,它的值與其它任何值皆不相等。

const over = Symbol();const isOver = function (_over) { return _over === over;}生成函數 range

range 函數接受一個起始和終止參數,返回一個求值函數,運行求值函數返回一個值,終止的時候返回終止值。

const range = function (from, to) { let i = from; return function () { if (i < to) { i++ console.log(’ranget’, i); return i } return over; }}轉換函數 map

接受一個求值函數和處理函數,獲取求值函數 flow 中的數據,對數據進行處理,返回一個流。

const map = function (flow, transform) { return function () { const data = flow(); console.log(’mapt’, data); return isOver(data) ? data : transform(data); }}過濾函數 filter

接受一個求值函數,對求值函數 flow 中數據進行過濾,找到符合的數據并且返回。

const filter = function (flow, condition) { return function () { while(true) { const data = flow(); if (isOver(data)) {return data; } if(condition(data)) {console.log(’filtert’, data);return data; } } }}中斷函數 stop

接受一個求值函數,當達到某個條件時中斷,可以用閉包函數加上 stop 函數接著實現一個 take 函數。

const stop = function (flow, condition) { let _stop = false; return function () { if (_stop) return over; const data = flow(); if (isOver(data)) { return data; } _stop = condition(data); return data; }}const take = function(flow, num) { let i = 0; return stop(flow, (data) => { return ++i >= num; });}收集函數 join

因為返回的都是一個函數,最后得使用一個 join 函數來收集所有的值并且返回一個數組。

const join = function (flow) { const array = []; while(true) { const data = flow(); if (isOver(data)) { break; } array.push(data); } return array;}測試:

const nums = join(take(filter(map(range(0, 20), n => n * 10), n => n % 3 === 0), 2));console.log(nums);

輸出:

range  1

map    1

range  2

map    2

range  3

map    3

filter     30

range  4

map    4

range  5

map    5

range  6

map    6

filter     60

更優雅的實現

上面使用 函數 + 閉包 實現了惰性求值,但是還是不夠優雅,絕大部分代碼都放到迭代和判斷求值是否完成上面去了。其實 es6 中還有更好方法來實現惰性求值,就是使用 generator,generator 已經幫我們解決了迭代和判斷流是否完成,我們就可以專注于邏輯,寫出更簡潔易懂結構清晰的代碼。

const range = function* (from, to) { for(let i = from; i < to; i++) { console.log(’ranget’, i); yield i; }}const map = function* (flow, transform) { for(const data of flow) { console.log(’mapt’, data); yield(transform(data)); }}const filter = function* (flow, condition) { for(const data of flow) { console.log(’filtert’, data); if (condition(data)) { yield data; } }}const stop = function*(flow, condition) { for(const data of flow) { yield data; if (condition(data)) { break; } }}const take = function (flow, number) { let count = 0; const _filter = function (data) { count ++ return count >= number; } return stop(flow, _filter);}

還得加上鏈式調用才算是完成了。

class _Lazy{ constructor() { this.iterator = null; } range(...args) { this.iterator = range(...args); return this; } map(...args) { this.iterator = map(this.iterator, ...args); return this; } filter(...args) { this.iterator = filter(this.iterator, ...args); return this; } take(...args) { this.iterator = take(this.iterator, ...args); return this; } [Symbol.iterator]() { return this.iterator; }}function lazy () { return new _Lazy();}

最后再測試一下:

const nums = lazy().range(0, 100).map(n => n * 10).filter(n => n % 3 === 0).take(2);for(let n of nums) { console.log(’num:t’, n, ’n’);}

輸出:

range  0

map    0

filter     0

num:   0

range  1

map    1

filter     10

range  2

map    2

filter     20

range  3

map    3

filter     30

num:   30

好了,大功告成。

總結

這樣我們就完成了一個最簡的數組惰性求值的庫,這里只是簡單實現了惰性求值,要放到工程中還需要添加很多細節。因為代碼不過 80 行,可以很清楚的了解惰性求值原理,還能加深對生成器的理解。

以上就是如何用JavaScript實現一個數組惰性求值庫的詳細內容,更多關于JavaScript實現數組惰性求值庫的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
91成人在线精品视频| 久久三级中文| 欧美99久久| 尹人成人综合网| 亚洲欧洲美洲国产香蕉| 日韩一区二区三区在线看| 亚洲区欧美区| 蜜臀av国产精品久久久久 | 欧美一区=区三区| 欧美日一区二区在线观看| 国产精品久久久一区二区| 国产一区二区三区亚洲| 欧美日韩一区二区综合| 免费成人在线影院| 国产精品任我爽爆在线播放| 欧美久久天堂| 蜜臀av在线播放一区二区三区| 国产精品最新| 成人自拍av| 视频一区二区欧美| 国产视频一区二| 亚洲啊v在线| 国产精品普通话对白| 欧美日韩中出| 久久天堂精品| 欧美一级二区| 欧美日韩在线网站| 97成人在线| 99久久激情| 久久激五月天综合精品| 久久久久久免费视频| 亚洲精品一级二级三级| 国产精品久久久久久久免费观看| 日韩视频不卡| 国产精品一卡| 国产综合亚洲精品一区二| 欧美亚洲三区| 欧美va亚洲va日韩∨a综合色| 日韩动漫一区| 激情综合自拍| 国产精品片aa在线观看| 午夜欧美视频| 国产在线观看91一区二区三区| 日韩一级精品| 97精品在线| 欧美日韩亚洲一区| 在线观看免费一区二区| 精品国产亚洲日本| 亚洲精品欧美| 成人精品亚洲| 国产精品巨作av| 玖玖玖国产精品| 91精品xxx在线观看| 97久久亚洲| 亚洲专区一区| 久久精品官网| 国产福利一区二区三区在线播放| 精品91久久久久| 成人午夜网址| 日本a级不卡| 日韩一区欧美二区| 不卡中文字幕| 91亚洲国产高清| 国产精品欧美三级在线观看 | 精品国产亚洲日本| 青草久久视频| 亚洲人www| 亚洲在线成人| 在线日韩一区| 日韩av首页| 国产欧洲在线| 久久久91麻豆精品国产一区| 91麻豆精品| 综合在线一区| 免费黄网站欧美| 欧美日韩日本国产亚洲在线| 久久久久久免费视频| 久久精品资源| 免费亚洲一区| 美日韩一区二区三区| 国产精品va视频| 国产精品香蕉| 国产精品毛片aⅴ一区二区三区| 日韩中文字幕高清在线观看| 亚洲成人二区| 一本大道色婷婷在线| 国产欧美日韩一级| 日韩一区免费| 日本少妇精品亚洲第一区| 亚洲美女91| 中文字幕成人| 亚洲精品九九| 欧美日韩国产一区二区三区不卡| 精品视频高潮| 麻豆精品蜜桃视频网站| 久久精品国产亚洲一区二区三区| 中文字幕视频精品一区二区三区| 狠狠爱www人成狠狠爱综合网| 国产欧洲在线| 天堂中文在线播放| 久久国产日本精品| 五月精品视频| 国产综合激情| 在线国产一区二区| 黑丝一区二区| 亚洲综合欧美| 亚洲图片久久| 中文字幕一区二区三区日韩精品| 中文字幕日韩亚洲| 91精品国产自产观看在线| 日本午夜精品| 欧美激情麻豆| 久久天堂成人| 久久亚洲影院| 日韩福利视频一区| 国产精品久久久久久久久久妞妞| 麻豆精品在线播放| 亚洲美女久久精品| 性欧美69xoxoxoxo| 色综合视频一区二区三区日韩 | 日韩高清不卡| 亚洲国产影院| 日韩专区一卡二卡| 久久激情综合网| 麻豆91小视频| 欧美日中文字幕| 亚洲无线观看| 久久亚洲精精品中文字幕| 国产精品字幕| 老司机久久99久久精品播放免费| 综合欧美亚洲| 久久a爱视频| 久久中文亚洲字幕| 日本成人在线视频网站| 福利欧美精品在线| 国产视频一区免费看| 国产精品mv在线观看| 欧美午夜精彩| 国产欧美日韩一区二区三区在线| 最新中文字幕在线播放| 日韩视频精品在线观看| 国产毛片精品| 色老板在线视频一区二区| 中文字幕日韩高清在线| 激情综合婷婷| 影音先锋国产精品| 久久狠狠久久| 视频一区中文| 国产精品玖玖玖在线资源| 亚洲高清av| 国产精品亚洲综合久久| 九一国产精品| 国产精品亚洲成在人线| 欧美日韩视频| 久久精品人人| 中文无码日韩欧| 成人在线免费观看网站| 亚洲一区二区免费在线观看| 精品国产99| 亚洲三级视频| 日本免费久久| 少妇精品在线| 亚洲成人国产| 麻豆免费精品视频| 久久不射网站| 日韩精品午夜| 卡一卡二国产精品| 亚洲va久久久噜噜噜久久| 久久精品国内一区二区三区水蜜桃| 91精品国产一区二区在线观看| 91精品福利| 日韩国产一区| 激情综合婷婷| 国产精品久久久久av蜜臀| 老牛国产精品一区的观看方式| 免费观看亚洲| 国产一卡不卡| 中文字幕av一区二区三区四区| 今天的高清视频免费播放成人| 精品中文字幕一区二区三区 | 中文精品视频| 久久久久国产一区二区| 国产精品99一区二区三| 国产日韩一区二区三区在线 | 日韩在线a电影| 亚洲黄色在线| 久久精品中文| 久久久久久亚洲精品美女| 91福利精品在线观看| 亚洲欧美日韩精品一区二区| 91精品国产91久久久久久黑人| 老牛国内精品亚洲成av人片 | 欧美精品中文| 日日摸夜夜添夜夜添国产精品| 六月天综合网| 亚洲免费影院| 夜夜嗨网站十八久久| 午夜久久福利| 午夜视频精品| 91久久亚洲|