循环

[].forEach(function(value, index, array) {
  // ...
});

对比jQuery中的$.each方法:

$.each([], function(index, value, array) {
  // ...
});

会发现,第1个和第2个参数正好是相反的,大家要注意了,不要记错了。后面类似的方法,例如$.map也是如此。

var data=[1,3,4] ; 
var sum=0 ;
data.forEach(function(val,index,arr){
  console.log(arr[index]==val);  // ==> true
  sum+=val            
})
console.log(sum);          // ==> 8

map

这里的map不是“地图”的意思,而是指“映射”。[].map(); 基本用法跟forEach方法类似:

array.map(callback,[ thisObject]);

callback的参数也类似:

[].map(function(value, index, array) {
  // ...
});

map方法的作用不难理解,“映射”嘛,也就是原数组被“映射”成对应新数组。下面这个例子是数值项求平方:

var data=[1,3,4]

var Squares=data.map(function(val,index,arr){
  console.log(arr[index]==val);  // ==> true
  return val*val           
})
console.log(Squares);        // ==> [1, 9, 16]

注意:由于forEach、map都是ECMA5新增数组的方法,所以ie9以下的浏览器还不支持(万恶的IE啊),不过呢,可以从Array原型扩展可以实现以上全部功能,例如forEach方法:

  1. if (!Array.prototype.forEach) {  
  2.     Array.prototype.forEach = function(callback, thisArg) {  
  3.         var T, k;  
  4.         if (this == null) {  
  5.             throw new TypeError(" this is null or not defined");  
  6.         }  
  7.         var O = Object(this);  
  8.         var len = O.length >>> 0; // Hack to convert O.length to a UInt32  
  9.         if ({}.toString.call(callback) != "[object Function]") {  
  10.             throw new TypeError(callback + " is not a function");  
  11.         }  
  12.         if (thisArg) {  
  13.             T = thisArg;  
  14.         }  
  15.         k = 0;  
  16.         while (k < len) {  
  17.             var kValue;  
  18.             if (k in O) {  
  19.                 kValue = O[k];  
  20.                 callback.call(T, kValue, k, O);  
  21.             }  
  22.             k++;  
  23.         }  
  24.     };  
  25. }  
posted @ 2017-03-25 06:28  <张磊>  阅读(142)  评论(0)    收藏  举报