创建数组方法:字面量表示法,Array构造函数
字面量表示法:
var a = []; //创建一个空数组 var a = [, , ,]; //创建一个有3个元素的数组,这3个元素的值为undefined。(最后的,会被忽略)
使用Array构造函数
var a = new Array(); //创建一个空数组,等同于[] var a = new Array(10); //创建一个数组,长度为10,但里面没有元素 var a = new Array(5, 4, 3, 2, 1) //创建一个数组,包含多个元素
稀疏数组:就是包含从0开始的不连续索引的数组。
注意:挡在数组直接量中省略值时,不会创建稀疏数组。因为省略的元素其实是存在的,只是值为undefined。这和数组元素根本不存在有区别。
注:如果变量a不存在或者值为undefined,那么 (a===undefined) 返回的是true
var a1 = [, , ,]; //有3个元素,值都为undefined var a2 = new Array(3); //该数组根本没有元素 0 in a1; //返回true: a1在索引0处有元素 0 in a2; //返回false:a2在索引0出没有元素
数组有length属性,表示数组的长度。在ECMAScript5中,可以使用Object.defineProperty()让数组的length属性变成只读的。
a = [1,2,3]; Object.defineProperty(a, "length", { writable: false }); a.length = 0; //a不会改变
可以使用push()方法,往数组尾部插入1个或多个元素。
可以使用unshift()方法,往数组首部插入一个元素。
可以使用delete运算符删除数组中的元素,但通过delete操作符,不会改变数组的长度。所以如果从数组中使用delete删除元素,数组会变成稀疏数组。
a = [1, 2, 3]; delete a[1]; 1 in a; //return false a.length; //依然是3
我们一般使用for循环遍历数组元素
for(var i=0, len = array.length; i<len; i++) { console.log(array[i]); }
数组方法:
join():返回字符串。(原数组不改变)
reverse():返回颠倒后的数组。(原数组被修改)
sort():返回排序后的数组。若没有参数,则以字母表顺序排序,如果数组包含undefined元素,会被拍到数组的尾部。如果想以其他方式排序,则需要给sort方法传递一个比较函数。假设第一个参数应该在前,那么函数应该返回一个小于0的数值。反之,第一个参数排在后,则应该返回一个大于0的数值。(原数组被修改)
concat():创建并返回一个新数组,如果插入的元素是数组,它会插入数组元素。(原数组不改变)
slice():返回指定数组的一个片段或子数组。它的两个参数分别指定了片段的开始和结束位置。返回的数组包含从第一个参数指定的位置到到第二个参数的之间的所有数组元素,但第二个参数所在位置的元素不包含在内。如果只指定一个参数,则返回从第一个参数到数组末尾的所有元素。如果参数中出现负数,表示相对于数组中最后一个元素的位置。例如:-1代表最后一个元素。(原数组不改变)
splice():在数组中插入或删除元素,有两个参数,参数1:插入或删除的起始位置;参数2:总共要删除的元素个数。第三个参数开始:为要插入到数组中的元素。该方法返回的是一个数组,里面包含被删除的元素。如果插入的是数组,则会插入数组本身,而非数组的元素(和concat()的差别)(原数组被修改)
a = [1,8,6,2,9]; console.log(a.slice(0,3)); //返回 [1, 8, 6] console.log(a); //返回 [2, 9]
push():往数组尾部添加一个或多个元素,返回新数组的长度。(原数组被改变)
pop():删除数组的最后一个元素,减小数组长度并返回它删除的值。(原数组被改变)
unshift():在数组头部添加一个或多个元素,返回新数组的长度。(原数组改变)
shift():删除数组的第一个元素,并将其返回。(原数组被改变)
toString():将每个元素转化为字符串并输出用逗号分隔的字符串列表。效果如不适用任何参数调用join()方法。
ECMAScript5给数组添加的新方法
在这里面,大多数方法的第一个参数接收一个函数,并对数组的每个元素调用一次该函数。大多数情况下,调用提供的函数使用三个参数:数组元素、元素的索引及数组本身。这些新方法,都不会改变原始数组。
forEach()方法:要调用的函数作为forEach()的第一个参数,然后forEach()使用三个参数调用该函数:数组元素、元素的索引及数组本身。forEach()没有break语句,所以一定会从头遍历到尾。
var a = [1,2,3,4,5]; var sum = 0; a.forEach(function(value) { sum += value; }); //遍历数组内所有元素,并相加,返回sum console.log(sum); //15 a.forEach(function(v, i, a) { a[i] = v + 1; }); //每个数组元素的值自加1 console.log(a); //[2,3,4,5,6]
map()方法:将调用的数组的每个元素传递给指定的函数,并返回一个数组,它包含函数的返回值。所以map()方法里的函数应该有返回值。
a = [1, 2, 3]; b = a.map(function(x) { return x*x; }); console.log(b); //[1, 4, 9]
filter()方法:传递给它的函数应该是一个判断函数,返回true或者false;当返回值为true时,该元素会被添加至一个新的数组,最终返回新数组。filter()会跳过稀疏数组中缺少的元素,所以返回的数组一定是稠密的。
a = [1, 2, 3, 4, 5]; b = a.filter(function(x) { return x / 3 == 0; }); //必须包含return console.log(b); //[3]
可以使用filter方法压缩空缺并删除undefined和null元素:
a = a.filter(function(x) { return x !== undefined && x !== null; });
every()和some()方法:他们是数组的逻辑判定,对每个数组元素执行函数,返回true或false。
every()方法:只有当数组内所有元素的返回值都为true时,才为true。只要有一个为false,则为false。(类似&&判断)
some()方法:只要数组内任一元素的返回值为true,就返回true;必须全部返回false,才为false。(类似||判断)
reduce()和reduceRight()方法:使用指定的函数将数组元素进行组合,生成单个值。
reduce()接收2个参数,第一个为调用的函数,第二个是传递给函数的初始值。第一个传递进去的函数式一个化简函数,它的任务是用某种方法把2个值组合或化简为一个值。
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.lastIndexOf(1); //3 a.indexOf(3); //-1
在ECMAScript5中,我们可以通过Array.isArray()方法判断传入的对象是否为数组。
Array.isArray([]); //true Array.isArray({}); //false
由于数组的类属性始终是Array,所以在ECMAScript3中,我们可以这样实现isArray()方法。
function isArray(a) { return typeof o === "object" && Object.prototype.toString.call(o) === "[object Array]"; }