Es5的特性以及发布很长时间了,增加了很多实用的特性(Array的 indexOf、every,some,forEach等,Object的create,keys,isFrozen等),这些特性已经得到个浏览器的支持,比如:IE9+,FF21+,chrome23+,opera 15+,SF6+都已经基本支持全部特性。详细的特性检测见:http://kangax.github.io/compat-table/es5/
很早时候都想认真理下特性的使用方法,总是被这样或者那样的理由推迟了,现在是时候理一下的时候了,毕竟ES6现在已经是草稿了,并且浏览器都在纷纷向其靠拢,如果再不整理出来,就更加落后了。
言归正转,现在开始Array的新特性:
先看下indexOf,lastIndexOf,every,some,forEach,map,filter,reduce,reduceRight特性
我们先定义一个数组
var arr = ["name","age","email","age"]; console.info(arr.indexOf("age")); console.info(arr.lastIndexOf("age"))
对于上面的代码,很容易理解,完全可以用string的思维去理解 下面看,every,我们先看下every的规范定义 Array.prototype.every(callback[,thisArg]); 根据规范描述,调用会返回一个boolean值,对于数组中的每一个值都会执行这个回调函数,如果某一个元素返回false,every返回立即返回false, 否则,会循环遍历数组中的每一个元素,更详细的规范请参考附件中的15.4.4.16,先看个例子吧 var arr = [2,9,4,5,3,7]; var greater = arr.every(function(e,i){ return e > 5 }); //是否大于5 var smaller = arr.every(function(e,i){ return e < 10 }); //是否小于10 console.info(greater) console.info(smaller)
上面的代码输出结果分别是false,true。看完规范是不是觉得好理解多了。
下面我们一块看下some的用法,还是先看下规范,
Array.prototype.some(callback[,thisArg]);
some的功能和every的功能比较类似,只不过some是判断某一个元素的值是不是满足某个条件,如果有这个一个元素,则立即返回true,否则会遍历完每个元素,返回false。详细的规范见附件中的15.4.4.17.
直接上个例子。
var arr = [2,9,4,5,3,7]; var greater = arr.some(function(e,i){ return e>10 }); //是否大于5 var smaller = arr.some(function(e,i){ return e<10 }); //是否小于10 console.info(greater) console.info(smaller)
forEach就是简单的循环遍历了,举个例子而已,不再解释
var arr = [2,9,4,5,3,7]; arr.forEach(function(e){ console.info(e+1) })
下面介绍下map,规范定义如下:
Array.prototype.map(callback[,thisArg]);
对数组中的每一个元素执行回调函数,把所有的返回值作为一个数组,
var arr = [2,9,4,5,3,7]; var smaller5 = arr.map(function(e,i){ return e<5 }); console.info(smaller5);
返回的结果为:true,false,true,false,true,false
下面看filter,规范定义如下:
Array.prototype.filter(callback[,thisArg]);
对数组中的每一个元素执行回调函数,把所有的返回值作为一个数组,注意,这个返回的数组可能是个空
var arr = [2,9,4,5,3,7]; var smaller5 = arr.filter(function(e,i){ return e<5 }); //是否小于5 console.info(smaller5);
下面看reduce的介绍,规范定义如下:
Array.prototype.filter(callback[,initValue]);
callback中有四个参数,previousValue, currentValue, currentIndex, array,
如果没有设置初始值, previousValue从第一个元素开始, currentValue从第二个元素开始循环。 总共循环Array.prototype.length �C 1次。如果设置了初始值,previousValue从初始值开始,currentValue从第一个元素开始循环。 总共循环Array.prototype.length次。 最后返回最后一次callback function调用的结果 var total = [0, 1, 2, 3].reduce(function(a, b){ return a + b; });
数组的新特性基本介绍完了,写的比较仓促,后续会补充。