今天看到的騷操作(1)- 或運(yùn)算符和閉包

今天在網(wǎng)上看到一段代碼,感覺很驚奇,因?yàn)樗婕暗胶芏嗟闹R(shí)點(diǎn),有閉包,有||運(yùn)算符的神奇使用等等。
先上代碼:

var memoize = function(f) {
  var cache = {};

  return function() {
    var arg_str = JSON.stringify(arguments);
    cache[arg_str] = cache[arg_str] || f.apply(f, arguments);
    return cache[arg_str];
  };
};
var squareNumber  = memoize(function(x){ return x*x; });

squareNumber(4);
//=> 16

squareNumber(4); // 從緩存中讀取輸入值為 4 的結(jié)果
//=> 16

squareNumber(5);
//=> 25

squareNumber(5); // 從緩存中讀取輸入值為 5 的結(jié)果
//=> 25

這是今天看JavaScript函數(shù)式編程的一本gitbook上找到的https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/ch3.html#%E8%BF%BD%E6%B1%82%E2%80%9C%E7%BA%AF%E2%80%9D%E7%9A%84%E7%90%86%E7%94%B1
這一章里面原意是講純函數(shù)的一些實(shí)現(xiàn)方式和有點(diǎn),但是看到這段代碼,我感覺筆者的代碼非常常簡(jiǎn)單,雖然這里面涉及到了閉包,以及一些邏輯運(yùn)算符的騷操作,但是一眼看去還是知道作者想要實(shí)現(xiàn)一些什么的。

代碼本意

這一段代碼是講兩數(shù)相乘,但是會(huì)把乘過(guò)的數(shù)保存在一個(gè)叫cache的對(duì)象里,比如你已經(jīng)計(jì)算過(guò)5 * 5了,他會(huì)把這個(gè)計(jì)算表達(dá)式和結(jié)果以鍵值對(duì)的方式存儲(chǔ)在這個(gè)cache對(duì)象中,但是這個(gè)cache只是函數(shù)里的一個(gè)變量,無(wú)法全局保存,這里他使用到了閉包。使其在函數(shù)作用域結(jié)束的時(shí)候不會(huì)被系統(tǒng)銷毀。

可以學(xué)習(xí)的點(diǎn)

  1. 優(yōu)化,以前再刷算法題的時(shí)候有過(guò)這樣的場(chǎng)景,就是在做重復(fù)計(jì)算的時(shí)候,用什么方法可以減少計(jì)算時(shí)間,這里的緩存,可以用作這一方法。
  2. || 運(yùn)算的神奇作用,以前很喜歡用&&做短路運(yùn)算,也就是&&之前的表達(dá)式計(jì)算為false的時(shí)候,會(huì)直接返回,并不會(huì)計(jì)算之后的表達(dá)式,也是一種代碼優(yōu)化。而||,我查了下,總結(jié)來(lái)說(shuō)就是返回第一個(gè)真值,如果||左邊的表達(dá)式是真的話,那右邊的計(jì)算就不會(huì)進(jìn)行了
var temp = 5 || ( console.log('計(jì)算了右值') )
console.log(temp); 
// 控制臺(tái)打印只顯示5

總結(jié)

|| 返回第一個(gè)真值,&&返回第一個(gè)假值
js里邊能判斷為假值的有以下:

  • null;
  • NaN;
  • 0;
  • 空字符串("");
  • undefined
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容