你不知道的EcmaScript5数组方法
来源:互联网 发布:软件著作权转让协议 编辑:程序博客网 时间:2024/06/11 16:23
这篇文章通过一个简单到只能实现四则预算的计算器例子,让大家了解一下EcmaScript5中的数组方法的特殊用法。
先看一下我做的一个计算器的例子吧。
我们把那些在EcmaScript5中才被引入的数组方法叫做Array Extras
,例如下面这些方法:
- Array.prototype.map
- Array.prototype.reduce
- Array.prototype.reduceRight
- Array.prototype.filter
- Array.prototype.forEach
- Array.prototype.every
- Array.prototype.some
看到这儿,你可能要问了:这些方法谁不知道啊?是啊,这些方法大家或多或少知道些,但下面这个函数中的某些用法,你未必知道了,看看吧!
这个函数是我上面那个计算器中的一个核心函数。
function calculate( calculation ) { var parts = calculation.match(/(?:\-?[\d\.]+)|[-\+\*\/]|\s+/g); if( calculation !== parts.join("") ) { throw new Error("Couldn't parse calculation"); } parts = parts.map(Function.prototype.call,String.prototype.trim); parts = parts.filter(Boolean); var nums = parts.map(parseFloat); var processed = []; for( var i = 0; i < parts.length; i++ ) { if( nums[i] === nums[i] ) { processed.push( nums[i] ); } else { switch( parts[i] ) { case "+": continue; case "-": processed.push(nums[++i] * -1); break; case "*": processed.push(processed.pop() * nums[++i]); break; case "/": processed.push(processed.pop() / nums[++i]); break; default: throw new Error("unknown operation: " + parts[i]); } } } return processed.reduce(function(result,elem) { return result + elem; });}
这段短短的函数有几处可圈可点:
1.短短的代码中用到了3个Array Extras:
map: parts = parts.map(Function.prototype.call,String.prototype.trim)
filter: parts = parts.filter(Boolean)
reduce:
return processed.reduce(function(result,elem) { return result + elem;});
2.Array Extras的用法很特别:
parts = parts.map(Function.prototype.call,String.prototype.trim)
这段代码如果让我们写,我们可能这样写:
parts = parts.map(function( elem, index, arr ) { return elem.trim();});
同样,parts = parts.filter(Boolean)
,我们可能写成:
parts = parts.filter(function( elem, index, arr ) { return Boolean( elem );})
3.巧妙地利用NaN !== NaN
判断运算符:
if( nums[i] === nums[i] ) { processed.push( nums[i] );}
关于Array Extras的更多沁人心脾的用法,请参考这里
- 你不知道的EcmaScript5数组方法
- ECMAScript5中数组方法的性能问题
- ECMAScript5数组新增方法
- ECMAscript5中的数组方法
- 你所不知道的Activity方法
- 你所不知道的Activity方法
- 你所不知道的Activity方法
- ECMAScript5(ES5)标准中扩展的数组Array方法
- ECMAScript5之前的数组操作
- 你不知道的JavaScript(二)数组
- 你不知道的JavaScript--Item30 数组进阶全掌握
- 你不知道的Java笔记3--数组
- JavaScript中你所不知道的数组ArrayBuffer
- JavaScript中你所不知道的数组ArrayBuffer
- JavaScript中你所不知道的数组ArrayBuffer
- JavaScript中你所不知道的数组ArrayBuffer
- JavaScript中你所不知道的数组ArrayBuffer
- 你不知道的JavaScript--Item30 数组进阶全掌握
- LightOJ 1385 Kingdom Division
- C语言关键字volatile(不知道的别说你是干嵌入式的)
- access2007 ODBC 驱动程序下载地址
- WIN7安装Ubuntu12.10以及安装后续,
- PB连接sybase anywhere数据库
- 你不知道的EcmaScript5数组方法
- PB连接access数据库
- VS2010中水晶报表应用与部署
- alloc copy assign的区别
- spoj6779 Can you answer these queries VII(gss7)动态树
- ORACLE WEBLOGIC 套件
- DELL R510网卡无故崩溃问题
- 【C++】输出流cout方法
- Vim Ctags Tlist 使用