1、创建数组:
var numArr = [];
var numArr = new Array();
var numArr = [1, 2, 3];
var numArr = new Array(1, 2, 3);
调用Array构造函数时,可以只传入一个参数,用来指定数组的长度:
var numArr = new Array(10);
console.log(numArr.length);
调用Array.isArray()来判断一个对象是否是数组:
console.log(numArr.isArray()); // 返回true/false
2、由字符生成数组:split()
var str = "Late in autumn";
var arr = str.split(" ");
console.log(arr);
3、
1)浅复制:新数组依然指向原来的数组,改变原数组内容,新数组也被改变。
var nums = [1, 2, 3, 4, 5];
var copyArr = nums;
console.log("nums: " + nums); //nums: 1,2,3,4,5
console.log("copyArr: " + copyArr); //copyArr: 1,2,3,4,5
nums[1] = 99;
console.log("nums: " + nums); //nums: 1,99,3,4,5
console.log("copyArr: " + copyArr); //copyArr: 1,99,3,4,5
2)深复制:两个数组互不相关
var nums = [1, 2, 3, 4, 5];
var copyArr = [];
copy(nums, copyArr);
console.log("nums: " + nums); //nums: 1,2,3,4,5
console.log("copyArr: " + copyArr); //copyArr: 1,2,3,4,5
nums[1] = 99;
console.log("nums: " + nums); //nums: 1,99,3,4,5
console.log("copyArr: " + copyArr); //copyArr: 1,2,3,4,5
//深复制函数
function copy(arr1, arr2){
for(var i=0; i<arr1.length; ++i){
arr2[i] = arr1[i];
}
}
3)slice():它截取数组的部分元素,然后返回一个新的数组:
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
var arr2 = arr.slice(0, 3);
console.log(arr2); //["A", "B", "C"]
var arr3 = arr.slice(3); //从索引3开始到最后
console.log(arr3); //["D", "E", "F", "G"]
注意slice()的起止参数包括开始索引,不包括结束索引。
如果不传递任何参数,它就会从头到尾截取所有元素。
利用这一点,我们可以很容易地复制一个数组,属于深复制,两数组互不相关:
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
var aCopy = arr.slice();
console.log(aCopy === arr); // false
4、查找元素:indexOf()、lastIndexOf()
用来查找传进来的函数在目标数组中是否存在,如果存在,则返回该元素在数组中的索引;如果不存在,则返回-1。
indexOf():总是返回第一个与参数相同的元素的索引;
lastIndexOf():返回相同元素中最后一个元素的索引
var arr = [1, 2, '3', 'late', 3, 2];
console.log(arr.indexOf(1)); // 0
console.log(arr.indexOf(2)); // 1
console.log(arr.lastIndexOf(2)); // 5
console.log(arr.indexOf('3')); // 2
console.log(arr.indexOf('late')); // 3
console.log(arr.indexOf(3)); // 4
console.log(arr.indexOf('2')); // -1
5、数组转为字符串:join() 和 toString()
var arr = ['A', 'B', 'C', 1, 2, 3];
console.log(arr.join('-')); // 'A-B-C-1-2-3'
console.log(arr.join()); // 'A,B,C,1,2,3'
console.log(arr.toString()); // 'A,B,C,1,2,3'
6、由已有数组创建新数组:
1)concat():合并多个数组创建一个新数组,不改变原数组
var arr1 = ['A', 'B', 'C'];
var arr2 = [1, 2, 3];
var arr3 = arr1.concat(arr2);
console.log(arr1); //['A', 'B', 'C]
console.log(arr2); //[1, 2, 3]
console.log(arr3); //['A', 'B', 'C', 1, 2, 3]
2)splice():截取一个数组的子集创建一个新数组,原数组也会被改变,第一个参数是截取的起始索引,第二个参数是截取的长度。
var arr1 = ['A', 'B', 'C', 1, 2, 3];
var arr2 = arr1.splice(2, 3);
console.log(arr1); //["A", "B", 3]
console.log(arr2); //["C", 1, 2]
7、为数组添加元素:
push() :将元素添加到数组末尾
unshift() :将元素添加在数组的开头
返回数组的长度
var arr1 = ['A', 'B', 'C'];
arr1.push(1);
console.log(arr1); //["A", "B", "C", 1]]
arr1.push(2, 3);
console.log(arr1); //["A", "B", "C", 1, 2, 3]
arr1.unshift(99);
console.log(arr1); //[99, "A", "B", "C", 1, 2, 3]
arr1.unshift(88, 77);
console.log(arr1); //[88, 77, 99, "A", "B", "C", 1, 2, 3]
8、从数组中删除元素:
pop():删除数组末尾的元素
shift():删除数组的第一个元素
返回删除的元素
var arr1 = ['A', 'B', 'C', 1, 2, 3];
var num1 = arr1.pop(); //3
console.log(arr1); //["A", "B", "C", 1, 2]
var num2 = arr1.shift(); //'A'
console.log(arr1); //["B", "C", 1, 2]
9、从数组的中间位置添加或删除元素:
splice():为数组添加函数,需传入参数如下:
1)起始索引(开始添加元素的地方)
2)需要删除的元素个数(添加元素时此参数设为0)
3)想要添加进数组的元素
var arr1 = ["A", "B", "C", 1, 2, 3];
//添加元素
arr1.splice(3, 0, 77, 88, 99);
console.log(arr1); //["A", "B", "C", 77, 88, 99, 1, 2, 3]
// 删除元素
arr1.splice(2, 3);
console.log(arr1); //["A", "B", 99, 1, 2, 3]
10、数组排序
1)倒序 - reverse()
var arr1 = ["A", "B", "C", 1, 2, 3];
arr1.reverse(); //[3, 2, 1, "C", "B", "A"]
console.log(arr1);
2) 顺序 - sort()
如果数组元素是字符串类型
var arr1 = ["G", "R", "D"];
arr1.sort(); //["D", "G", "R"]
console.log(arr1);
如果数组元素是数字类型:由于sort()方法是按字典顺序对元素进行排列,因此它假定元素都是字符串类型,
为了让sort()方法也能排序数字类型的元素,可以在调用方法时传入一个大小比较函数。
var arr1 = [2,33,1,41,31,9];
console.log("arr1: " + arr1);
arr1.sort();
console.log("arr1: " + arr1); //1,2,31,33,41,9
arr1.sort(compare);
console.log("arr1: " + arr1); //1,2,9,31,33,41
function compare(num1, num2) {
return num1 - num2;
}
11、forEach():接受一个函数作为参数,对数组中的每个元素使用该函数
function square(num){
console.log(num + "*" + num + "=" + num*num);
}
var nums = [1, 2, 3, 4, 5];
nums.forEach(square);
输出:
1*1=1
2*2=4
3*3=9
4*4=16
5*5=25
12、every():接受一个返回值为布尔类型的函数,对数组中的每个元素使用该函数。如果对所有的元素,该函数都返回true,则该方法返回true。
function isEven(num){
return num % 2 == 0;
}
var nums = [2, 4, 6, 8, 9];
var even = nums.every(isEven);
if(even){
console.log("所有元素均为偶数!");
}else{
console.log("并非所有元素都是偶数!");
}
13、some()函数也接受一个返回值为布尔类型的函数,只要有一个元素使得该函数返回true,该方法就返回true
function isEven(num) {
return num % 2 == 0;
}
var nums = [2, 4, 6, 8, 9];
var even = nums.some(isEven);
if(even) {
console.log("有一些元素是偶数!");
} else {
console.log("所有元素都不是偶数!");
}
14、reduce()方法接受一个函数,返回一个值!
该方法会从一个累加值开始,不断对累加值和数组中后续元素调用该函数,直到数组中的最后一个元素,最后返回得到的累加值。
还提供了reduceRight()方法,从右往左执行
如求和:
var numsArr = [1, 2, 3, 4, 5];
var sum = numsArr.reduce(add);
console.log(sum); //15
var strArr = ['late ', "in ", "autumn "];
var strs1 = strArr.reduce(add);
console.log(strs1); //late in autumn
var strs2 = strArr.reduceRight(add);
console.log(strs2); //autumn in late
function add(total, num){
return total + num;
}
15、map():与forEach()方法类似,区别在于map()返回一个新数组,该数组元素是对原有元素应用某个函数得到的结果。
function curve(num){
return num *= 5;
}
var numsArr1 = [1, 2, 3, 4, 5];
var numsArr2 = numsArr1.map(curve);
console.log(numsArr1); //[1, 2, 3, 4, 5]
console.log(numsArr2); //[5, 10, 15, 20, 25]
//对字符串
function first(word){
return word[0];
}
var words = ["late", "in", "autumn"];
var words2 = words.map(first);
console.log(words2); //["l", "i", "a"]
console.log(words2.join("")); //lia
16、filter():与every()方法相似,传入一个返回值为布尔类型的函数,对所有元素应用该函数,该方法返回一个包含返回结果为true的元素的数组
function isEven(num){
return num % 2 == 0;
}
function isOdd(num){
return num % 2 != 0;
}
var nums = [1, 2, 3, 4, 5, 6];
var evens = nums.filter(isEven);
console.log(evens); //[2, 4, 6]
var odds = nums.filter(isOdd);
console.log(odds); //[1, 3, 5]