数组的空位
读取空位,返回undefined,可以取到length,但不能取到键名。
var arr=[null,,undefined];
console.log(arr[0]);//null
console.log(0 in arr);//true
console.log(arr[1]);//undefined
console.log(1 in arr);//false
console.log(arr[2]);//undefined
console.log(2 in arr);//true
console.log(arr.length);//3
Array.isArray()
typeof [] //object
typeof {} //object
typeof null //object
Array.isArray([]) //true
Array实例方法
toString()数组转为字符串
join()数组转为字符串,可以添加分隔符
var arr=[1,2,3,[4,5]];
arr.toString();//1,2,3,4,5
arr.join();//1,2,3,4,5
arr.join("|");//1|2|3|4,5
push()在数组末尾添加一个或多个元素,也可用于合并数组。会改变原来的数组。
var arr1=[1,2,3,[4,5]];
var arr2=[6,7];
[].push.apply(arr1,arr2);
console.log(arr1);//[1,2,3,[4,5],6,7]
// [].push.call(arr1,arr2);不能用,会变成[1,2,3,[4,5],[6,7]]
pop()在数组末尾删除一个元素,返回该元素,会改变原来的数组。
[].pop() //undefined,空数组用pop()不会报错,返回undefined
concat()合并多个数组,返回新数组,不会改变原来的数组
var arr1=[1,2,3,[4,5]];
var arr2=[6,7];
console.log(arr1.concat(arr2,arr2));//[1,2,3,[4,5],6,7,6,7]
console.log(arr1);//[1,2,3,[4,5]]
console.log(1,2);//[1,2,3,[4,5],1,2],可以接受非数组的参数
var arr3=arr1.concat();//返回arr1的浅拷贝
shift()删除数组第一个元素,返回该元素,原数组改变
unshift()在数组头添加一个元素或多个元素,返回数组长度,原数组改变
var arr=[3,4,5];
console.log(arr.shift());//3
console.log(arr);//[4,5]
console.log(arr.unshift(1,2,3));//5
console.log(arr);//[1,2,3,4,5]
reverse()颠倒数组中的元素顺序,返回新数组,原数组也会改变
var arr=[3,4,5];
console.log(arr.reverse());//[5,4,3]
console.log(arr);//[5,4,3]
slice()截取数组的一部分,返回新数组,原数组不会改变,第一个参数是起始位置,第二个参数是终止位置
splice()删除数组的一部分,添加新元素,原数组会改变,第一个参数是起始位置,第二个参数是删除个数,后面的参数是增添的元素
var arr=[1,2,3,4,5,6];
console.log(arr.slice(2,4));//[3,4]
console.log(arr);//[1,2,3,4,5,6],原数组不会改变
console.log(arr.splice(1,3,'a','b'));//[2, 3, 4]
console.log(arr);//[1, "a", "b", 5, 6]
如果slice方法、splice方法的位置参数是负数,则表示倒数计算的位置。
如果只是单纯地插入元素,splice方法的第二个参数可以设为0。
var arr=[1,2,3,4,5,6];
console.log(arr.splice(1,0,'a'));//[]
console.log(arr);//[1,'a',2,3,4,5,6]
slice方法的一个重要应用,是将类似数组的对象转为真正的数组。
Array.prototype.slice.call(arguments);
sort()排序,冒泡排序,按照字典顺序,原数组会改变,可自定义排序方式。
var arr=[6,5,4,3,2,1];
console.log(arr.sort());//[1,2,3,4,5,6]
console.log(arr);//[1,2,3,4,5,6]
var arr=[1,2,3,4,5];
console.log(arr.sort(function(a,b){return b-a;}));//[5,4,3,2,1]
console.log(arr);//[5,4,3,2,1]
函数如果返回值大于0,表示第一个元素排在第二个元素后面;其他情况下,都是第一个元素排在第二个元素前面。
map()所有元素调用同一个函数,返回新数组,原数组不改变
var arr=[1,2,3,4,5];
console.log(arr.map(function(a){return a+1;}));//[2,3,4,5,6]
console.log(arr);//[1,2,3,4,5,]
console.log(arr.map(function(elem,index,arr){return elem+index+arr.length;}));//[6,8,10,12,14]
map方法不仅可以用于数组,还可以用于字符串,用来遍历字符串的每个字符。但是,不能直接使用,而要通过函数的call方法间接使用,或者先将字符串转为数组,然后使用。
console.log([].map.call(str,function(elem,index,arr){return elem.toUpperCase();}));
map方法还可以接受第二个参数,表示回调函数执行时this所指向的对象。
console.log(arr.map(function(elem){return elem+this.length;},arr));//[6,7,8,9,10]
如果数组有空位,map方法的回调函数在这个位置不会执行,会跳过数组的空位。
forEach()跟map很像,但是一般不用来返回值
forEach方法无法中断执行,总是会将所有成员遍历完。
map方法还可以接受第二个参数,表示回调函数执行时this所指向的对象。
forEach方法会跳过数组的空位。
forEach方法也可以用于类似数组的对象和字符串。
var obj={
num:[1,2,3],
name:'abc',
print:function(){
this.num.forEach(function(){
console.log(this.name);
},this);
}
}
obj.print();
filter()所有元素调用同一个函数,返回true的元素组成新数组,原数组不会改变
var arr=[3,6,8,9,5,2];
var res=arr.filter(function(n){return n%2==0;});
console.log(res);//[6,8,2]
console.log(arr);//[3,6,8,9,5,2]
filter方法还可以接受第二个参数,指定测试函数所在的上下文对象(即this对象)。
reduce()和reduceRight()依次处理每个元素,最后累计为一个值
数组元素求和
var arr=[3,6,8,9,5,2];
var res=arr.reduce(function(a,b){
return a+b;
});
console.log(res);//33
也可以指定累计的初值:
var arr=[3,6,8,9,5,2];
var res=arr.reduce(function(a,b){
return a+b;
},10);
console.log(res);//33
reduce是从左到右处理,reduceRight是从右到左处理。
indexOf()和lastIndexOf()返回元素第一次出现的位置和最后一次出现的位置
var arr=[3,6,8,9,6,2];
console.log(arr.indexOf(6));//1
console.log(arr.lastIndexOf(6));//4
如果数组中包含NaN,这两个方法不适用,即无法确定数组成员是否包含NaN。
245

被折叠的 条评论
为什么被折叠?



