JavaScript数组也是对象,它使用单一的变量存储一系列的值。es6
在JavaScript中,数组必须使用数字索引,对象可使用命名索引。
数组是特殊类型的对象,具备特有的一些属性和方法。数组
方案1
ECMAScript5定义新方法Array.isArray()浏览器
var arr = []; var obj = {}; console.log(Array.isArray(arr)); // true console.log(Array.isArray(obj)); // false
此方案不支持老的浏览器。数据结构
方案2app
var arr = []; console.log(Object.prototype.toString.call(arr)); // [object Array] var obj = {}; console.log(Object.prototype.toString.call(obj)); // [object Object]
使用字面量建立dom
var arr = [];
使用构造函数建立函数
var arr = new Array(); console.log(arr); // [] arr = new Array(2); console.log(arr); // [empty × 2],当构造函数只传一个参数时如2,生成一个长度为2,都为空位的数组 arr = new Array(1, 2); console.log(arr); // [1, 2]
出于简洁、可读性和执行速度的考虑,建议使用第一种方法。测试
var arr = [1, 2]; console.log(arr[1]);// 2
var arr = [1, 2]; arr[1] = 3; console.log(arr); // [1, 3]
var arr = [1, 2]; arr[3] = 3; console.log(arr); // [1, 2, empty, 3] console.log(arr[4]); // undefined
数组属于对象,因此可使用delete运算符执行删除操做this
var arr = [0]; console.log(arr); // [0] delete arr[0]; console.log(arr); // [empty]
var arr = [1, 2]; console.log(arr.length); // 2
var arr = [1, 2]; for (var i = 0, len = arr.length; i < len; i ++) { console.log(arr[i]); } // 1 // 2
var arr = [1, 2]; for (index in arr) { console.log(arr[index]); } // 1 // 2
var arr1 = [1]; var arr2 = [2]; console.log(arr1.concat(arr2)); // [1, 2] var arr = [1]; console.log(arr.concat(2, 3)); // [1, 2, 3]
不会改变原数组编码
var arr = [1, 2]; console.log(arr.join('-')); // 1-2
不会改变原数组
var arr = [1, 2]; console.log(arr.sort()); // [1, 2] console.log(arr.sort((item1, item2) => { return item1 - item2; })); // [1, 2] console.log(arr.sort((item1, item2) => { return item2 - item1; })); // [2, 1] console.log(arr); // [2, 1]
返回对数组的引用,在原数组上进行排序,不生成副本。
说明
return item1 - item2
为升序,反之return item2 - item1
为降序。因此return 0.5 - Math.random()
能够实现随机排序。方案一
查找最小值(最大值同理)
var arr = [1, 2]; console.log(arr.sort(function (a, b) { return a - b; })[0]);
须要对数组进行排序,效率较低
方案二
var arr = [1, 2]; function getArrMax(arr) { return Math.max.apply(null, arr); } function getArrMin(arr) { return Math.min.apply(null, arr); } console.log(getArrMax(arr)); // 2 console.log(getArrMin(arr)); // 1
var arr = [1, 2]; console.log(arr.pop()); // 2 console.log(arr); // [1]
会改变原数组
var arr = [1, 2]; console.log(arr.push(3)); // 3 console.log(arr); // [1, 2, 3]
会改变原数组
push()方法和pop()方法使用数组提供的先进后出栈的功能。
var arr = [1, 2]; console.log(arr.reverse()); // [2, 1]
会改变原数组
var arr = [1, 2]; console.log(arr.shift()); // 1 console.log(arr); // [2]
会改变原数组
var arr = [1]; console.log(arr.unshift(3)); // 2 console.log(arr); // [3, 1]
改变原有的数组
arrayObject.slice(start,end)
start、end均可以使用负值从数组的尾部选取元素,
var arr = [1, 2, 3]; console.log(arr.slice(1, 2)); // [2] console.log(arr); // [1, 2, 3]
不会改变原数组,若是须要删除数组中的一段元素,应该使用方法Array.splice()
arrayObject.splice(index,howmany,item1,.....,itemX)
howmany若是设置为0,则不会删除项目。
var arr = [1, 2, 3, 4, 5]; console.log(arr.splice(2, 1, 6)); // [3] console.log(arr); // [1, 2, 6, 4, 5]
改变原始数组。
var arr = [1, 2, 3]; console.log(arr.toString()); // 1,2,3
返回值与没有参数的join()方法返回的字符串相同,元素之间用逗号分隔
首先调用每一个数组元素的toLocaleString()方法,而后使用地区特定的分隔符把生成的字符串链接起来,造成一个字符串。
var arr = ['a', 'b', 'c']; console.log(arr.toLocaleString()); // a,b,c
var arr = [1, 2]; console.log(arr.valueOf()); // [1, 2]
一般由JavaScript在后台自动调用,并不显式地出如今代码中。
var arr = [1, 2]; arr.forEach(function (item, index, arr) { console.log(item); console.log(index); console.log(arr); }); // 1 // 0 // [1, 2] // 2 // 1 // [1, 2]
不改变原数组
var arr = [1, 2]; console.log(arr.map(function (item, index, array) { return item * 2; })); // [2, 4] console.log(arr); // [1, 2]
不改变原数组
var arr = [1, 2]; console.log(arr.filter(function (item, index, array) { return item > 1; })); // [2] console.log(arr); // [1, 2]
不改变原数组
var arr = [1, 2, 3]; var sum = arr.reduce(function (total, value, index, array) { return total + value; }); console.log(sum); // 6 console.log(arr); // [1, 2, 3]
能够接受一个初始值
var arr = [1, 2, 3]; var sum = arr.reduce(function (total, value, index, array) { return total + value; }, 4); console.log(sum); // 10 console.log(arr); // [1, 2, 3]
var arr = [1, 2, 3]; var sum = arr.reduceRight(function (total, value, index, array) { return total + value; }, 4); console.log(sum); // 10 console.log(arr); // [1, 2, 3]
var arr = [1, 2, 3]; console.log(arr.every(function (value, index, array) { return value < 3; })); // false
var arr = [1, 2, 3]; console.log(arr.some(function (value, index, array) { return value < 3; })); // true
array.indexOf(item, start)
item 必需。要检索的项目。
start 可选。从哪里开始搜索。负值将从结尾开始的给定位置开始,并搜索到结尾。
未找到项目返回-1。
项目屡次出现,返回第一次出现的位置。
var arr = [1, 2, 3]; console.log(arr.indexOf(2)); // 1
array.lastIndexOf(item, start)
item 必需。要检索的项目。
start 可选。从哪里开始搜索。负值将从结尾开始的给定位置开始,并搜索到开头。
var arr = [1, 2, 3]; console.log(arr.lastIndexOf(2)); // 1
var arr = [1, 2, 3]; console.log(arr.find(function (value, index, array) { return value > 1; })); // 2
var arr = [1, 2, 3]; console.log(arr.findIndex(function (value, index, array) { return value > 1; })); // 1
所谓相似数组的对象,本质特征只有一点,即必须有length属性。
var arrLike = { "0": 1, "1": 2, length: 2, }; // ES5的写法 console.log([].slice.call(arrLike)); // [1, 2] // ES6的写法 console.log(Array.from(arrLike)); // [1, 2]
只要部署了Iterator接口的数据结构,Array.from都能将其转为数组,如Set和Map。
var set = new Set([1, 2]) console.log(Array.from(set)); // [1, 2]
Array.from还能够接受第二个参数,做用相似于数组的map方法。
var arrLike = { "0": 1, "1": 2, length: 2, }; console.log(Array.from(arrLike, value => value *2)); // [2, 4]
若是map函数里面用到了this关键字,还能够传入Array.from的第三个参数,用来绑定this。
var arrLike = { "0": 1, "1": 2, length: 2, }; var context = { key: 1, } console.log(Array.from(arrLike, function () { return this.key *2 }, context)); // [2, 2]
console.log(Array.of(1, 2)); // [1, 2] console.log(Array.of(2)); // [2]
参数个数不一样,不会有像new Array()同样行为有差别。
Array.of()的模拟实现
function ArrayOf(){ return [].slice.call(arguments); }
Array.prototype.copyWithin(target, start = 0, end = this.length)
var arr = [1, 2, 3, 4, 5]; console.log(arr.copyWithin(0, 3)); // [4, 5, 3, 4, 5] console.log(arr); // [4, 5, 3, 4, 5]
arr.fill(value, start, end);
console.log([1, 2, 3].fill(4, 1, 2)); // [1, 4, 3]
keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。
for (let index of [1, 2].keys()) { console.log(index); } // 0 // 1 for (let value of [1, 2].values()) { console.log(value); } // 1 // 2 for (let [index, value] of [1, 2].entries()) { console.log(index, value); } // 0 1 // 1 2
Array.prototype.includes(value, start);
该方法的第二个参数表示搜索的起始位置。
console.log([1, 2, 3].includes(3, 3)); // false console.log([1, 2, 3].includes(3, -1)); // true
includes不会致使对NaN的误判
console.log([1, 2, [3, 4]].flat()); // [1, 2, 3, 4] console.log([1, 2, [3, [4, 5]]].flat(1)); // [1, 2, 3, Array(2)] console.log([1, 2, [3, [4, 5]]].flat(2)); // [1, 2, 3, 4, 5]
flat()的参数表明“拉平”几层的嵌套数组,使用Infinity关键字,无论多少层嵌套,均可以转成一维数组。
arr.flatMap(function callback(currentValue, index, array) { // ... }, thisArg)
console.log([2, 3, 4].flatMap((x) => [x, x * 2])); // [2, 4, 3, 6, 4, 8]
只能展开一层数组。
console.log([1, 2, 3, 4].flatMap(x => [[x * 2]])); // [[2], [4], [6], [8]]