你不知道的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的更多沁人心脾的用法,请参考这里

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信支付被限制怎么办 跨行三天不到账怎么办 测速正常但实际很慢怎么办 善领wifi上网慢怎么办 文件太大拷贝不到u盘怎么办 电脑的视频文件不显示缩略图怎么办 无线网连接不上怎么办 路由器wifi密码忘了怎么办 路由器账号密码忘了怎么办 刷卡刷多了钱怎么办 刷卡刷了两次钱怎么办 小米手机强刷后一联网就被锁怎么办 苹果刷机出现的问题怎么办 小米手机解不开图案锁怎么办 小米6无限重启怎么办 小米5一直显示mi怎么办 小米手机电池进入休眠状态怎么办 小米3s开不开机怎么办 小米n充电关机开机不了怎么办? 关机后强制刷机怎么办 红米手机开机画面怎么办 红米note1无法清理数据怎么办 红米2a密码忘记怎么办 线刷也不成功该怎么办 红米2开不了机怎么办 魅族无限重启怎么办 坚果pro无法双清怎么办 usb外置网卡网速慢怎么办? 无线路由器被改密码怎么办 电脑打不开flv格式的视频怎么办 电脑打不开pdf格式的文件怎么办 pdf格式在电脑上打不开怎么办 zip压缩的时候空间不足怎么办 电子发票填抬头错了怎么办 发票写错一个字怎么办 普票税率开错了怎么办 税率开错为17了怎么办 电子发票抬头错了怎么办 发票抬头错了一个字怎么办 5月税率开错了怎么办 如果发票是假的怎么办