今天看到的骚操作(1)- 或运算符和闭包

今天在网上看到一段代码,感觉很惊奇,因为它涉及到很多的知识点,有闭包,有||运算符的神奇使用等等。
先上代码:

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 的结果
//=> 16

squareNumber(5);
//=> 25

squareNumber(5); // 从缓存中读取输入值为 5 的结果
//=> 25

这是今天看JavaScript函数式编程的一本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
这一章里面原意是讲纯函数的一些实现方式和有点,但是看到这段代码,我感觉笔者的代码非常常简单,虽然这里面涉及到了闭包,以及一些逻辑运算符的骚操作,但是一眼看去还是知道作者想要实现一些什么的。

代码本意

这一段代码是讲两数相乘,但是会把乘过的数保存在一个叫cache的对象里,比如你已经计算过5 * 5了,他会把这个计算表达式和结果以键值对的方式存储在这个cache对象中,但是这个cache只是函数里的一个变量,无法全局保存,这里他使用到了闭包。使其在函数作用域结束的时候不会被系统销毁。

可以学习的点

  1. 优化,以前再刷算法题的时候有过这样的场景,就是在做重复计算的时候,用什么方法可以减少计算时间,这里的缓存,可以用作这一方法。
  2. || 运算的神奇作用,以前很喜欢用&&做短路运算,也就是&&之前的表达式计算为false的时候,会直接返回,并不会计算之后的表达式,也是一种代码优化。而||,我查了下,总结来说就是返回第一个真值,如果||左边的表达式是真的话,那右边的计算就不会进行了
var temp = 5 || ( console.log('计算了右值') )
console.log(temp); 
// 控制台打印只显示5

总结

|| 返回第一个真值,&&返回第一个假值
js里边能判断为假值的有以下:

  • null;
  • NaN;
  • 0;
  • 空字符串("");
  • undefined

你可能感兴趣的:(今天看到的骚操作(1)- 或运算符和闭包)