a = ['ant','Bug','cat','Dog']; a.sort();//['Bug','Dog','ant','cat']; a.sort(function(s,t){ var a = s.toLowerCase(); var b = t.toLowerCase(); if(a < b)return -1; if(a > b)return 1; return 0; });//['ant','bug','cat','dog']
【tips】使用sort()方法创建一个随机数组
function compare(){ return Math.random() - 0.5; } var array = [1,2,3,4,5]; console.log(array.sort(compare));//[2,1,5,4,3]
数组拼接方法
【concat()】
concat()方法基于当前数组中的所有项创建一个新数组,先创建当前数组一个副本,然后将接收到的参数添加到这个副本的末尾,最后返回新构建的数组。所以concat()不影响原数组
如果不给concat()方法传递参数时,它只是复制当前的数组;如果参数是一个或多个数组,则该方法会将这些数组中的每一项都添加到结果数组中;如果传递的值不是数组,这些值就会被简单地添加到结果数组的末尾
var numbers = [1,2]; console.log(numbers,numbers.concat(3,4));//[1,2] [1,2,3,4] console.log(numbers,numbers.concat([5,4,3],[3,4,5],1,2));//[1,2] [1,2,5,4,3,3,4,5,1,2] console.log(numbers,numbers.concat(4,[5,[6,7]]));//[1,2] [1,2,4,5,[6,7]]
如果不提供参数,concat()方法返回当前数组的一个浅拷贝。所谓“浅拷贝”,指的是如果数组成员包括复合类型的值(比如对象),则新数组拷贝的是该值的引用
//该方法实际只复制了数组的第一维,数组第一维存放的是第二维的引用,而第二维才是实际存放他们的内容 var numbers = [1,2]; var newNumbers = numbers.concat(); console.log(numbers,newNumbers);//[1,2] [1,2] numbers[0] = 0; console.log(numbers,newNumbers);//[0,2] [1,2] var numbers = [[1,2]]; var newNumbers = numbers.concat(); console.log(numbers,newNumbers);//[[1,2]] [[1,2]] numbers[0][0] = 0; console.log(numbers,newNumbers);//[[0,2]] [[0,2]]
concat()方法也可以用于将对象合并为数组,但是必须借助call()方法
var newArray = Array.prototype.concat.call({ a: 1 }, { b: 2 }) console.log(newArray);// [{ a: 1 }, { b: 2 }] console.log(newArray[0].a);//1
创建子数组方法
【slice()】
slice()方法基于当前数组中的一个或多个项创建一个新数组,接受一个或两个参数,即要返回项的起始和结束位置,最后返回新数组,所以slice()不影响原数组
slice(start,end)方法需要两个参数start和end,返回这个数组中从start位置到(但不包含)end位置的一个子数组;如果end为undefined或不存在,则返回从start位置到数组结尾的所有项
如果start是负数,则start = max(length + start,0)
如果end是负数,则end = max(length + end,0)
start和end无法交换位置
如果没有参数,则返回原数组
var numbers = [1,2,3,4,5]; console.log(numbers.slice(2));//[3,4,5] console.log(numbers.slice(2,undefined));//[3,4,5] console.log(numbers.slice(2,3));//[3] console.log(numbers.slice(2,1));//[] console.log(numbers.slice(-3));//-3+5=2 -> [3,4,5] console.log(numbers.slice(-8));//max(5 + -8,0)=0 -> [1,2,3,4,5] console.log(numbers.slice(0,-3));//-3+5=2 -> [1,2] console.log(numbers.slice(-2,-1));//-2+5=3;-1+5=4; -> [4]
如果不提供参数,slice()方法返回当前数组的一个浅拷贝
//该方法实际只复制了数组的第一维,数组第一维存放的是第二维的引用,而第二维才是实际存放他们的内容 var numbers = [1,2]; var newNumbers = numbers.slice(); console.log(numbers,newNumbers);//[1,2] [1,2] numbers[0] = 0; console.log(numbers,newNumbers);//[0,2] [1,2] var numbers = [[1,2]]; var newNumbers = numbers.slice(); console.log(numbers,newNumbers);//[[1,2]] [[1,2]] numbers[0][0] = 0; console.log(numbers,newNumbers);//[[0,2]] [[0,2]]
slice()方法涉及到Number()转型函数的隐式类型转换,当start被转换为NaN时,相当于start = 0;当end被转换为NaN时(end为undefined除外),则输出空数组
var numbers = [1,2,3,4,5]; console.log(numbers.slice(NaN));//[1,2,3,4,5] console.log(numbers.slice(0,NaN));//[] console.log(numbers.slice(true,[3]));//[2,3] console.log(numbers.slice(null,undefined));//[1,2,3,4,5] console.log(numbers.slice({}));//[1,2,3,4,5] console.log(numbers.slice('2',[5]));//[3,4,5]
可以使用slice()方法将类数组对象变成真正的数组
var arr = Array.prototype.slice.call(arrayLike); Array.prototype.slice.call({ 0: 'a', 1: 'b', length: 2 })// ['a', 'b'] Array.prototype.slice.call(document.querySelectorAll("div")); Array.prototype.slice.call(arguments);
数组删改方法
【splice()】