今天在网上看到一段代码,感觉很惊奇,因为它涉及到很多的知识点,有闭包,有||运算符的神奇使用等等。
先上代码:
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只是函数里的一个变量,无法全局保存,这里他使用到了闭包。使其在函数作用域结束的时候不会被系统销毁。
可以学习的点
- 优化,以前再刷算法题的时候有过这样的场景,就是在做重复计算的时候,用什么方法可以减少计算时间,这里的缓存,可以用作这一方法。
- || 运算的神奇作用,以前很喜欢用&&做短路运算,也就是&&之前的表达式计算为false的时候,会直接返回,并不会计算之后的表达式,也是一种代码优化。而||,我查了下,总结来说就是返回第一个真值,如果||左边的表达式是真的话,那右边的计算就不会进行了
var temp = 5 || ( console.log('计算了右值') )
console.log(temp);
// 控制台打印只显示5
总结
|| 返回第一个真值,&&返回第一个假值
js里边能判断为假值的有以下:
- null;
- NaN;
- 0;
- 空字符串("");
- undefined