##创建数组 var arr = Array(); var arr = Array([size]); var arr = Array([elem1[,elem2[,elem3[,…[,elemN]]]]]);

var arr = new Array(-1);
var arr = new Array(1.1);
// 以上会报错

var arr = new Array(11111111111111);
// size的大小不能超过2的32次方,超过会变成arr的对象属性

arr['1'] = 1;
arr['1'] === arr[1] //true

arr[0.1] = 0;
arr[0.1] = arr['0.1']

##稀疏数组 var a1 = [,,,];//length:3 var a2 = new Array(3); var a3 = [1,2,3]; console.log( 0 in a1);//false console.log( 0 in a2);//false console.log( 0 in a3);//true delete a3[0]; console.log( 0 in a3);//false

length设置小于原值,删除溢出的;新增一数组元素,length始终元素序号+1

pushpop在数组尾部操作,与a[a.length]赋值一样,支持多参数,返回数组长度

unshiftshift在数组头部操作

arr = [1, 2, 3, 4, 3, 4, 0]
arr.push([6,7])
// 返回8
console.log(arr)
// [1, 2, 3, 4, 3, 4, 0, Array[2]]

##类数组对象

可用针对真正数组遍历的代码来遍历;可用数组的通用方法。

在ES5(包括IE8)中,字符串行为类似于只读数组。除了用charAt访问单个的字符外,还可以使用方括号;可以使用[]来调用join,返回新字符串、filter,返回字符数组。例如:

s = "JavaScript"

Array.prototype.join.call(s, " ") // => "J a v a S c r i p t"

Array.prototype.filter.call(s, // 过滤字符串中的字符
    function (x) {
        return x.match(/[^aeiou]/); // 只匹配非元音字母
    }).join(""); //  => "JvScrpt"

注意,字符串是只读的,如果使用修改调用数组的方法,会报错。譬如:pushsortreversesplice等数组方法。

##数组遍历 if(!a[i]) //null+undefined+不存在的元素 if(a[i]!==undefined) //undefined+不存在的元素 if(!(i in a)) //不存在的元素 可用for in处理稀疏数组,不过数组不推荐用这个,能够枚举继承的属性名

##数组校验

  • 数组校验

      isArray = Array.isArray || function(o){
          return  Object.prototype.toString.call(o) === "[object Array]";
      }
    
  • 类数组校验

      function isArrayLike(o){
          if(o &&
              typeof o ==='object' &&
              o.nodeType != 3 &&
              isFinite(o.length) &&
              o.length >= 0 &&
              o.length === Math.floor(o.length) &&
              o.length < 4294967296)
              return true;
          else
              return false;
      }
    

##数组ES3方法

joinreversesort,concatslicesplicepushpopunshiftshifttoStringtoLocalString concat—结果返回、sortreversejoin—结果返回、slice—结果返回、splicepushpopunshiftshift

  • slice 不改变原数组

    正数 第一个参数和不到第二个参数(从零算起,相对于索引)数组;负数, 倒数 第一个参数和倒数第二个参数的数组。

    Object.prototype.toString.call(obj).slice(8, -1);

    复制数组的时候,请使用Array#slice

      var len = items.length,
          itemsCopy = [],
          i;
    	
      // bad
      for (i = 0; i < len; i++) {
        itemsCopy[i] = items[i];
      }
    	
      // good
      itemsCopy = items.slice();
    
  • splice 改变原数组
    第一个参数(从零算起),插入或删除的起始位置,第二个参数:删除的个数,第三或其它任意个参数,要插入的元素。

    删除数组元素,保持数组连续,就用splice,返回的由删除元素组成的数组

  • concat 连接两数组

    返回一个新创建的数组,元素包含调用concat的原始数组的元素和concat的每个参数,如果这些参数中的任何一个自身是数组,则连接的数组的元素,而非数组本身。但要注意,concat不会递归扁平化数组的数组,也不会修改调用的数组。

      var res = [1,2].concat([3,4])
      // res=[1, 2, 3, 4]
      res = res.concat(5,[7,8])
      // [1, 2, 3, 4, 5, 7, 8]
    
  • reverse 反序,改变原数组

      var arr = [1,'ab',{'pro':'newGood'},function(){},null];
      arr.reverse();
    
  • sort 排序,改变原数组

    传入空参数时,默认采用ASCII排序 传入回调时,回调返回值大于0,增序;回调返回值小于0,降序

数组ES5方法

forEachmapfiltereverysomereducereduceRightindexOflastIndexOf ###forEach var data = [1,2,3,4,5]; data.forEach(function(v,i,a){ a[i] = v + 1; })

不能像for中使用break跳出循环,在forEach传入参数的函数中抛出foreach.break异常。

// a为数组,f为函数,t为函数f的执行环境
// foreachBreak = new Error("StopIteration");

try {
    a.forEach(function(item,i){
    	if(item == '')
    		throw foreachBreak;
    }, t);
} catch (e) {
    if (e === foreachBreak)
        return;
    else
        throw e;
}

在ES3不支持forEach可引入以下方法

  Array.prototype.forEach || (Array.prototype.forEach = function(fn, context) {
    for (var i = 0, len = this.length >>> 0; i < len; i++) {
      if (i in this) {
        fn.call(context, this[i], i, this);
      }
    }
  });

###map 传递的参数跟forEach一样,不同的是map调用的函数要有返回值。该函数返回新创建的数组,不修改调用的数组。

a = [1,2,3];
b = a.map(function(x){
    return x *x;
});	    在ES3不支持`map`可引入以下方法

  Array.prototype.map = Array.prototype.map || function (callback, thisArg) {
            var T, A, k;
            if (this == null) {
                throw new TypeError(" this is null or not defined");
            }
            // 1. 将O赋值为调用map方法的数组.
            var O = Object(this);
            // 2.将len赋值为数组O的长度.
            var len = O.length >>> 0;
            // 4.如果callback不是函数,则抛出TypeError异常.
            if ({}.toString.call(callback) != "[object Function]") {
                throw new TypeError(callback + " is not a function");
            }
            // 5. 如果参数thisArg有值,则将T赋值为thisArg;否则T为undefined.
            if (thisArg) {
                T = thisArg;
            }
            // 6. 创建新数组A,长度为原数组O长度len
            A = new Array(len);
            // 7. 将k赋值为0
            k = 0;
            // 8. 当 k < len 时,执行循环.
            while (k < len) {
                var kValue, mappedValue;
                //遍历O,k为原数组索引
                if (k in O) {
                    //kValue为索引k对应的值.
                    kValue = O[ k ];
                    // 执行callback,this指向T,参数有三个.分别是kValue:值,k:索引,O:原数组.
                    mappedValue = callback.call(T, kValue, k, O);
                    // 返回值添加到新书组A中.
                    A[ k ] = mappedValue;
                }
                // k自增1
                k++;
            }
            // 9. 返回新数组A
            return A;
        }; ###filter	

调用和forEach一样,返回的数组元素是调用的数组的一个子集

a = [5,4,3,2,1];

smallvalues = a.filter(function(x){
    return x<3;
});// [2,1]

everyother = a.filter(function(x,i){
    return i%2 ==0;
});// [5,3,1]

// 跳过稀疏数组中缺少的元素,返回的数组总是稠密的
var dense = sparse.filter(function(){
    return true;
});

// 压缩空缺并删除undefined和null元素
a = a.filter(function(x){
    return x != null;
})

every和some

对数组进行逻辑判定,返回true或false;注意:everysome确定返回值时,停止遍历数组元素。

reduce和reduceRight

使用指定的函数将数组元素进行组合,生成单个值。这在函数式编程中是常见的操作,称为“注入”和“折叠”。reduce需要两个参数,第一个参数是执行化简的函数,函数的参数分别为:回调的化简累计结果值、数组元素、元素的索引、数组的本身;第二个参数(可选)是传递给函数的初始值

var a = [1,2,3,4,5];

var sum = a.reduce(function(x,y){
    return x + y;
},0);

var product = a.reduce(function(x,y){
    return x * y;
},1);

var max = a.reduce(function(x,y){
    return x>y?x:y;
}); `reduceRight`的工作原理和`reduce`一样,不同的是它按照数组索引从高到低(从右到左)处理数组。

###indexOf和lastIndexOf 第一个参数代表要搜索的元素,第二个元素代表搜索的起始位置。可为负数,它代表相对数组末尾的偏移量,-1时,指定数组的最后一个元素。

var a = [0, 1, 2, 1, 0];

a.indexOf(1); // => 1:a[1]是1

a.lastIndexOf(1) // => 3:a[3]是1

a.indexOf(3) // =>-1: 没有值为3的元素

// 找出数组a中所有值为x的位置
function findAll(a, x) {

    var result = [],
        len = a.length,
        pos = 0;

    while (pos < len) {
        pos = a.indexOf(x, pos);
        if (pos === -1) {
            break;
        }
        result.push(pos);
        pos++;
    }
	return result;
} 字符串也有`indexOf`和`lastIndexOf`方法

##一些扩展 Array.prototype.unique = function(){ var temp = {}; for(var i= 0,l = this.length;i<l;i++){ if(!temp[this[i]]){ temp[this[i]] = true; } } this.length = 0; for (var i in temp) this[this.length] = i; return this; }

参考

http://tieba.baidu.com/p/1478111698

分享到: