JS数组详解
JS数组的元素可以是对象或者其他数组
JS数组是动态的,无需指定长度
JS数组是JS对象的特殊形式
1.
var a = [ , ,] 有两个元素,都为undefined
var b = new Array(10) 长度为10的数组。构造函数创建数组,一个参数则为指定长度,多个参数则为指定元素。
2.
了解稀疏数组是了解JS数组真实本质的一部分
3.
当数组length被设置为小于当前数组长度的非负整数n时,数组中索引值大于等于n的元素被删除
当length被设置大于当前长度时,只是在数组尾部创建一个空的区域
让length属性不能修改:
var a = [1,2,3];
Object.definedProperty(a,"length",{"writable:false"}); //让length属性只读
4.数组方法:
push():在数组末尾添加一个或多个元素,并返回数组的新长度
unshift():在数组首部插入元素,其他元素依次后移,并返回新长度
pop():删除数组最后一个元素,数组长度减1,并返回被删除的元素
shift():从头部删除一个元素,返回被删除的元素,并所有元素依次前移
splice():插入,删除,替换数组,会修改调用数组,并返回被删除的部分。位置从0开始,参数第一个为开始位置,第二个为个数,其后任意个参数指定了插入的元素,从第一个参数指定的位置插入
var a = [1,2,3,4,5,6,7,8];
a.splice(4);//返回[5,6,7,8],此时a为[1,2,3,4]
a.splice(1,2);//返回[2,3],此时a为[1,4]
a.splice(1,1);//返回[4],此时a为[1]
slice():返回一个数组的一个片段或子数组,两个参数决定开始和结束位置,从第一个参数到第二个参数,但不包含第二个参数位置
join():将数组所有元素都转化为字符串,并拼接在一起,返回最后生成的字符串,默认以“,”为分隔符,可以用参数指定分隔符。是String.split()的逆向操作:将字符串分割成数组
reverse():将数组中的元素颠倒排序,返回逆序数组,采取替换方式,即对原数组产生影响
sort():将数组的元素排序并返回修改后的数组,默认按字母表排序,undefined元素被排到最后,若不想按字母表排序,则传递一个比较函数
concat():创建并返回一个新数组,元素包括原数组和concat()的每个参数
toString()/toLocaleString():toString()与无参join()一样,用“,”连接为字符串;toLocalString(0是toString()本地化版本,即使用本地化的分隔符
ECMAS5中数组方法:(都不修改原始数组,大多数方法第一个参数接收一个函数)
forEach():遍历数组,不能再所有元素遍历完前终止,即无break,若想提前终止,则把forEach()放入try块中,并能抛出一个异常
var a = [1,2,3,4,5];
//求和:
var sum = 0;
a.forEach(function(value){sum += value;});
//元素自加1:
a.forEach(function(v,i,a){ a[i] = v + 1;});
map():返回新数组,不修改调用的数组
var a = [1,2,3];
var b = a.map(function(x){return x*x;});
b为[1,4,9]
filter():按参数函数过滤数组,函数返回值为true则传递对应元素
var a = [5,4,3,2,1];
var b = a.filter(function(x){return x < 3});
b为[2,1]
every()/some():every()对应所有,some对应存在
var a = [1,2,3];
a.every(function(x){return x < 10});//返回true
a.some(function(x){return x > 2});//返回true
reduce()/reduceRight():将数组元素进行组合,生成单个值
var a = [1,2,3];
var sum = a.reduce(function(x,y){return x+y},0);//第一个参数为组合操作函数,第二个为传递函数的初始值,传给x,无第二个参数则用数组元素作为初始值
reduceRight()按照数组索引从高到低处理,原理和reduce()一样
indexOf()/lastIndexOf():搜索整个数组中具有给定值得元素,返回找到的第一个元素的索引,从0开始,若没有则返回-1。index0f()从头到尾,lastIndexOf()从尾到头,第一个参数为查找对象,第二个参数指定开始位置索引
5.遍历优化:数组长度应该只查询一次
for(var i = 0,len = a.length; i < len; i++){
//排除null,undefined和不存在的元素
if(!a[i]) continue;
//跳过undefined和不存在的元素
if(a[i] === undefined) continue;
//跳过不存在的元素
if(!(i in a)) continue;
//或者for/in,不存在的索引不会被遍历到 :
for(var i in a){}
//跳过继承
if(!a.hasOwnProperty(i)) continue;
//跳过不是非负整数
if(String(Math.floor(Math.abs(Number(i))))) continue;
ECMA5新增遍历方法:forEach()
6.
判断数组类型:Array.isArray([])
7.
js数组的copy不能简单赋值,可以通过concat()或者slice()克隆
8.
空数组判断:
var a = [];
a == [] ==> false
应该通过a.length == 0 来判断