声明定义
数组是对象,是引用类型(传址类型)
new Array(...args)
* 关键字 new 可省略
* 不定参数个数为 1 时,创建长度为该参数的数组
var arr1 = new Array(1, 2, 3, 4, 5);
var arr2 = Array(5, 4, 3, 2, 1);
var arr3 = new Array(5);
console.log(arr1); // [1, 2, 3, 4, 5]
console.log(arr2); // [5, 4, 3, 2, 1]
console.log(arr3); // [undefined, undefined, undefined, undefined, undefined]
字面量
👍
var arr = [1, 2, 3, 4, 5];
Array.of(...args)
* es6 新增的创建数组的方法
* 完美解决 new Array() 无法创建长度为 1 的数组
var arr1 = Array.of(1, 2, 3, 4, 5);
var arr2 = Array.of(5);
console.log(arr1); // [1, 2, 3, 4, 5]
console.log(arr2); // [5]
类数组
* 具有 length 属性的可迭代的对象,但不具有数组的方法
* 常见类数组
- DOM 对象列表(NodeList)
Array.from(arrayLike)
**_desc_**
类数组转换为数组_**params**_
{ object } arrayLike 类数组_**return**_
{ array }
[].slice.call(arrayLike)
**_desc_**
类数组转换为数组_**params**_
{ object } arrayLike 类数组_**return**_
{ array }
[...arrayLike]
**_desc_**
类数组转换为数组_**params**_
{ object } arrayLike 类数组_**return**_
{ array }
长度
arr.length
_**params**_
{ array } arr_**return**_
{ number }
var arr = [1, 2, 3, 4, 5, 6, 7];
console.log(arr.length); // 7
增删改
arr[arr.length] = el
* 会改变原数组
**_desc_**
尾部追加元素_**params**_
{ array } arr_**params**_
{ any } el 追加的元素_**return**_
{ void }
var arr = [1, 2, 3];
arr[arr.length] = 4;
console.log(arr); // [1, 2, 3, 4]
[...args, ...arr, ...args]
**_desc_**
头部 / 尾部追加元素_**params**_
{ array } arr_**params**_
{ any } args 追加的元素_**return**_
{ array }
var arr = [1, 2, 3];
var arr1 = [...arr, 4, 5];
console.log(arr); // [1. 2, 3]
console.log(arr1); // [1, 2, 3, 4, 5]
arr.push(...args)
* 会改变原数组
**_desc_**
尾部追加元素_**params**_
{ array } arr_**params**_
{ any } args 追加的元素_**return**_
{ number } 追加后数组的长度
var arr = [1, 2, 3];
var length = arr.push(4, 5);
console.log(length); // 5
console.log(arr); // [1, 2, 3, 4, 5]
arr.pop()
* 会改变原数组
**_desc_**
尾部移除最后一个元素_**params**_
{ array } arr_**return**_
{ any } 被移除的元素
var arr = [1, 2, 3];
var el = arr.pop();
console.log(el); // 3
console.log(arr); // [1, 2]
arr.unshift(...args)
* 会改变原数组
**_desc_**
头部追加元素_**params**_
{ array } arr_**params**_
{ any } args 追加的元素_**return**_
{ number } 追加后数组的长度
var arr = [1, 2, 3];
var length = arr.unshift(4);
console.log(length); // 4
console.log(arr); // [4, 1, 2, 3]
arr.shift()
* 会改变原数组
**_desc_**
头部移除首个元素_**params**_
{ array } arr_**return**_
{ any } 被移除的元素
var arr = [1, 2, 3];
var el = arr.shift();
console.log(el); // [1]
console.log(arr); // [2, 3]
arr.splice(startIndex, length, ...args)
* 会改变原数组
* 方法执行步骤
步骤一:根据起始位置及删除的元素数量,对数组进行删除操作
* 删除:length !== 0 && args 不存在
* 新增:length === 0 && args 存在
* 修改:length !== 0 &&
**_desc_**
数组的删除操作,可实现增删改_**params**_
{ array } arr_**params**_
{ number } startIndex 删除的起始索引_**params**_
{ number } length 删除的元素数量,默认值:arr.length - 1_**params**_
{ any } args 删除操作后,在起始索引处追加的元素_**return**_
{ array } 被删除的元素组成的数组
var arr1 = [1, 2, 3];
var arr2 = [1, 2, 3];
var arr3 = [1, 2, 3];
var arr4 = [1, 2, 3];
var arr5 = [1, 2, 3];
var list1 = arr1.splice(0, 0, 4); // 新增
var list2 = arr2.splice(0, 2); // 删除
var list3 = arr3.splice(0, 2, "1", "2"); // 删除后再追加 --> 修改
var list4 = arr4.splice(0, 2, "1"); // 删除后再追加
var list5 = arr5.splice(0, 2, "1", "2", "3"); // 删除后再追加
console.log(arr1, list1); // [4, 1, 2, 3], []
console.log(arr2, list2); // [3], [1, 2]
console.log(arr3, list3); // ["1", "2", 3], [1, 2]
console.log(arr4, list4); // ["1", 3], [2, 3]
console.log(arr5, list5); // ["1", "2", "3", 3], [2, 3]
截取
arr.slice(startIndex, endIndex)
* 包含开始索引,但不包含结束索引
_**params**_
{ array } arr_**params**_
{ array } startIndex 截取的开始索引,默认值:0_**params**_
{ array } endIndex 截取的结束索引,默认值:arr.length - 1_**return**_
{ array } 截取后的新数组
var arr = [1, 2, 3, 4, 5];
var list1 = arr.slice();
var list2 = arr.slice(1, 3);
console.log(list1); // [1, 2, 3, 4, 5]
console.log(list2); // [2, 3]
查询
arr.indexOf(el, startIndex)
_**desc**_
从左至右查询,返回首个匹配元素的索引_**params**_
{ array } arr_**params**_
{ any } el 需要寻找的元素_**params**_
{ number } startIndex 查询的起始位置,默认值:0_**return**_
{ number } 存在返回索引,不存在返回 -1
var arr = [1, 2, 3, 4, 5];
var index1 = arr.indexOf(3);
var index2 = arr.indexOf(3, 3);
console.log(index1); // 2
console.log(index2); // -1
arr.lastIndexOf(el, startIndex)
_**desc**_
从右至左查询,**返回首个匹配元素的索引**_**params**_
{ array } arr_**params**_
{ any } el 需要寻找的元素**_params_**
{ number } startIndex 查询的起始位置,默认值:arr.length - 1_**return**_
{ number } 存在返回索引,不存在返回 -1
var arr = [1, 2, 3, 4, 5];
var index1 = arr.lastIndexOf(3);
var index2 = arr.lastIndexOf(3, 1);
console.log(index1); // 2
console.log(index2); // -1
arr.includes(el, startIndex)
_**desc**_
判断数组中是否存在该元素_**params**_
{ array } arr_**params**_
{ any } el 需要寻找的元素**_params_**
{ number } startIndex 查询的起始位置,默认值:0_**return**_
{ boolean }
var arr = [1, 2, 3, 4, 5];
var bool1 = arr.includes(3);
var bool2 = arr.includes(3, 3);
console.log(bool1); // true
console.log(bool2); // false
arr.find(callback[, ctx])
* 基于迭代器方法
_**desc**_
查询数组中第一个满足查询条件的元素_**params**_
{ array } arr_**params**_
{ function } callback 迭代器的回调函数**_params_**
{ any } value 元素的值**_params_**
{ number } index 元素的索引**_params_**
{ array } array 原数组_**return**_
{ boolean } 查询条件_**params**_
{ object } ctx 回调函数中 this 指向,回调为箭头函数时该参数无效_**return**_
{ any } 返回第一个满足查询条件的元素
var min = 1;
var arr = [1, 2, 3, 4, 5];
var item1 = arr.find(function(value, index, array) {
return value > 3;
});
var item2 = arr.find(function(value, index, array) {
return value > this; // this 指向 min 变量,即 value > 1
}, min);
console.log(item1); // 4
console.log(item2); // 2
arr.findIndex(callback[, ctx])
* 基于迭代器方法
_**desc**_
查询数组中第一个满足查询条件的元素的索引_**params**_
{ array } arr_**params**_
{ function } callback 迭代器的回调函数**_params_**
{ any } value 元素的值**_params_**
{ number } index 元素的索引**_params_**
{ array } array 原数组_**return**_
{ boolean } 查询条件_**params**_
{ object } ctx 回调函数中 this 指向,回调为箭头函数时该参数无效_**return**_
{ any } 返回第一个满足查询条件的元素的索引
var arr = ["a", "b", "c"];
var value = arr.find((value, index) => index === 1);
var index = arr.findIndex((value, index) => value === "c");
console.log(value); // "b"
console.log(index); // 2
循环遍历
for
for(let i = 0; i < 100; i++) {
console.log(i);
}
for in
_**params**_
{ array } arr_**params**_
{ string `_return_` { void }**
var arr = ["a", "b", "c"];
for (let key in arr) {
console.log(key); // "0" ---> "1" ---> "2"
console.log(typeof key); // "string"
}
for of
_**params**_
{ array } arr_**params**_
{ any `_return_` { void }**
var arr = ["a", "b", "c"];
for (let value of arr) {
console.log(value); // "a" ---> "b" ---> "c"
}
arr.forEach(callback[, ctx])
* 基于迭代器方法
_**desc**_
查询数组中第一个满足查询条件的元素的索引_**params**_
{ array } arr_**params**_
{ function } callback 迭代器的回调函数**_params_**
{ any } value 元素的值**_params_**
{ number } index 元素的索引**_params_**
{ array } array 原数组_**return**_
{ boolean } 查询条件_**params**_
{ object } ctx 回调函数中 this 指向,回调为箭头函数时该参数无效_**return**_
{ void }
var _this = { name: "zhangsan" };
var arr = [1, 2, 3, 4, 5];
arr.forEach(function (value, index, array) {
console.log(this); // { name: "zhangsan" }
arr[index] = value * 2;
}, _this);
console.log(arr); // [2, 4, 6, 8, 10]
arr.forEach((value, index, array) => {
console.log(this); // window
}, _this);
其他方法实现循环遍历
了解,不推荐
**arr.map((value) => {});**
**arr.filter((value) => true);**
**arr.every((value) => true);**
**arr.some((value) => true);**
**...**
映射
arr.map(callback[, ctx])
* 基于迭代器方法
_**params**_
{ array } arr_**params**_
{ function } callback 迭代器的回调函数**_params_**
{ any } value 元素的值**_params_**
{ number } index 元素的索引**_params_**
{ array } array 原数组_**return**_
{ any } 映射后的元素_**params**_
{ object } ctx 回调函数中 this 指向,回调为箭头函数时该参数无效_**return**_
{ array } 映射后的元素组成的数组
var arr = [1, 2, 3, 4, 5];
var list = arr.map((value) => value * 2);
console.log(arr); // [1, 2, 3, 4, 5]
console.log(list); // [2, 4, 6, 8, 10]
过滤
arr.filter(callback[, ctx])
* 基于迭代器方法
_**params**_
{ array } arr_**params**_
{ function } callback 迭代器的回调函数**_params_**
{ any } value 元素的值**_params_**
{ number } index 元素的索引**_params_**
{ array } array 原数组_**return**_
{ boolean } 过滤条件_**params**_
{ object } ctx 回调函数中 this 指向,回调为箭头函数时该参数无效_**return**_
{ array } 满足条件的元素组成的数组
var arr = [1, 2, 3, 4, 5];
var list = arr.filter((value, index, array) => {
return value > 2;
});
console.log(list); // [3, 4, 5]
多功能
arr.reduce(callback, initialValue)
* 基于迭代器方法
_**params**_
{ array } arr_**params**_
{ function } callback 迭代器的回调函数**_params_**
{ any } prev 上一次回调的返回值或 initialValue**_params_**
{ any } cur 元素的值**_params_**
{ number } index 元素的索引**_params_**
{ array } array 原数组_**return**_
{ any }_**params**_
{ any } initialValue 初始值_**return**_
{ any }
var arr = [1, 2, 3, 4, 5];
var total = arr.reduce(function(pre, cur) {
return pre + cur;
}, 0);
console.log(total); // 15
检测
arr.every(callback[, ctx])
* 基于迭代器方法
_**desc**_
全局检测_**params**_
{ array } arr_**params**_
{ function } callback 迭代器的回调函数**_params_**
{ any } value 元素的值**_params_**
{ number } index 元素的索引**_params_**
{ array } array 原数组_**return**_
{ boolean } 检测条件_**params**_
{ object } ctx 回调函数中 this 指向,回调为箭头函数时该参数无效_**return**_
{ boolean } 所有元素均返回 true 时,结果才返回 true
var arr = [1, 2, 3, 4, 5];
var bool1 = arr.every((value) => value > 3);
var bool2 = arr.every((value) => value >= 1);
console.log(bool1); // false
console.log(bool2); // true
arr.some(callback[, ctx])
* 基于迭代器方法
_**desc**_
局部检测_**params**_
{ array } arr_**params**_
{ function } callback 迭代器的回调函数**_params_**
{ any } value 元素的值**_params_**
{ number } index 元素的索引**_params_**
{ array } array 原数组_**return**_
{ boolean } 检测条件_**params**_
{ object } ctx 回调函数中 this 指向,回调为箭头函数时该参数无效_**return**_
{ boolean } 只要任意一个元素返回 true,结果就返回 true
var arr = [1, 2, 3, 4, 5];
var bool1 = arr.some((value) => value > 3);
var bool2 = arr.some((value) => value > 5);
console.log(bool1); // true
console.log(bool2); // false
合并
arr.join(connector)
**_desc_**
数组的元素合并成字符串_**params**_
{ array } arr_**params**_
{ any } connector 连接符_**return**_
{ string }
var arr = [1, 2, 3, 4, 5];
var str1 = arr1.join("");
var str2 = arr1.join(true);
console.log(str1); // "12345"
console.log(str2); // "1true2true3true4true5"
**arr.concat(...args)**
* args 为 Array 类型时,先展开再合并
**_desc_**
合并数组、尾部追加元素_**params**_
{ array } arr_**params**_
{ any } args 合并的元素_**return**_
{ array }
var arr = [1, 2, 3];
var list1 = arr.concat(4, 5);
var list2 = arr.concat([4, 5], true, { a: 1 });
console.log(list1); // [1, 2, 3, 4, 5]
console.log(list2); // [1, 2, 3, 4, 5, true, { a: 1 }]
排序
❓ arr.sort(sortBy)
* 会改变原数组
_**desc**_
数组排序_**params**_
{ array } arr_**params**_
{ function } sortBy 排序规则**_params_**
{ any } a 左侧元素**_params_**
`_return_` { number } 两个元素的顺序 * 返回值 < 0,a 排在 b 前面 * 返回值 > 0,b 排在 a 前面 * 返回值 = 0,无变化 * 即返回 a - b 为 升序,返回 b - a 为 降序 `_return_` { array } 排序后的数组**
var arr1 = [3, 1, 4, 2];
var arr2 = [3, 1, 4, 2];
arr1.sort((a, b) => a - b); // 升序
arr2.sort((a, b) => b - a); // 降序
console.log(arr1); // [1, 2, 3, 4]
console.log(arr2); // [4, 3, 2, 1]
arr.reverse()
* 会改变原数组
_**desc**_
数组倒序_**params**_
{ array } arr_**return**_
{ array } 倒序后的原数组
var arr = [1, 2, 3, 4];
var list = arr.reverse();
console.log(arr); // [4, 3, 2, 1]
console.log(list); // [4, 3, 2, 1]
console.log(arr === list); // true
填充
arr.fill(el, startIndex, endIndex)
* 会改变原数组
* 包含开始索引,但不包含结束索引
_**params**_
{ array } arr_**params**_
{ array } el 填充的元素_**params**_
{ array } startIndex 填充的开始索引,默认值:0_**params**_
{ array } endIndex 填充的结束索引,默认值:arr.length - 1_**return**_
{ array } 填充后的原数组
var arr = [1, 2, 3, 4, 5];
var list1 = arr.fill("a", 1, 3);
var list2 = Array(3).fill(0);
console.log(list1, arr); // [1, "a", "a", 4, 5], [1, "a", "a", 4, 5]
console.log(list1 === arr); // true
console.log(list2); // [0, 0, 0]
Array.from(arrayLike, callback[, ctx])
_**params**_
{ object } arrayLike 类数组_**params**_
{ function } callback 类数组中元素的映射方法_**params**_
{ any } value 类数组中的元素_**params**_
{ number } index 类数组中元素的索引_**params**_
{ object } 回调函数中 this 指向。可选,默认值: undefined_**return**_
{ array } 填充后的数组
var arrayLike = { length: 5 };
var arr = Array.from(arrayLike, function(value, index) {
return index;
}, this)
console.log(arr); // [0, 1, 2, 3, 4]
arr.copyWithin(index, startIndex, endIndex)
* 会改变原数组
* 包含开始索引,但不包含结束索引
**_desc_**
内部填充。复制内部元素后,替换指定位置_**params**_
{ array } arr_**params**_
{ array } index 替换的开始索引,默认值:0_**params**_
{ array } startIndex 复制的开始索引,默认值:0_**params**_
{ array } endIndex 复制的结束索引,默认值:arr.length - 1_**return**_
{ array } 截取后的新数组
var arr1 = [1, 2, 3, 4, 5];
var arr2 = [1, 2, 3, 4, 5];
var list1 = arr1.copyWithin(2);
var list2 = arr2.copyWithin(2, 0, 2);
console.log(list1); // [1, 2, 1, 2, 3]
console.log(list2); // [1, 2, 1, 2, 5]
清空数组
arr = []
arr.length = 0
👍
arr.splice(0)
while(arr.length > 0) { arr.pop() }
do { arr.pop() } while(arr.length > 0)
迭代器
arr.keys()
**_desc_**
数组的元素索引迭代器_**params**_
{ array } arr_**return**_
{ object } Array Iterator {}
* 可通过 .next() 获取迭代器中的值:{ value, done }
* value:元素索引
* done:是否迭代完成
var arr = ["a", "b", "c"];
var keys = arr.keys();
console.log(keys.next()); // { value: 0, done: false }
console.log(keys.next()); // { value: 1, done: false }
console.log(keys.next()); // { value: 2, done: false }
console.log(keys.next()); // { value: undefined, done: true }
arr.values()
**_desc_**
数组的元素值迭代器_**params**_
{ array } arr_**return**_
{ object } Array Iterator {}
* 可通过 .next() 获取迭代器中的值:{ value, done }
* value:元素值
* done:是否迭代完成
var arr = ["a", "b", "c"];
var values = arr.values();
console.log(values.next()); // { value: "a", done: false }
console.log(values.next()); // { value: "b", done: false }
console.log(values.next()); // { value: "c", done: false }
console.log(values.next()); // { value: undefined, done: true }
arr.entries()
**_desc_**
数组的元素索引 + 元素值迭代器_**params**_
{ array } arr_**return**_
{ object } Array Iterator {}
* 可通过 .next() 获取迭代器中的值:{ value, done }
* value:[ 元素索引, 元素值 ]
* done:是否迭代完成
var arr = ["a", "b", "c"];
var entries = arr.entries();
console.log(entries.next()); // { value: [0, "a"], done: false }
console.log(entries.next()); // { value: [1, "b"], done: false }
console.log(entries.next()); // { value: [2, "c"], done: false }
console.log(entries.next()); // { value: undefined, done: true }
扁平化
arr.flat()
* 不改变原数组
**_desc_**
数组纬度 - 1_**params**_
{ array } arr_**return**_
{ array }
var arr1 = [1, 2, 3];
var arr2 = [1, [2, 3]];
var arr3 = [1, [2, [3]]];
console.log(arr1.flat()); // [1, 2, 3]
console.log(arr2.flat()); // [1, 2, 3]
console.log(arr3.flat()); // [1, 2, [3]]
console.log(arr3); // [1, [2, [3]]]
Proxy 代理数组 ❓
* 在访问数组前添加一层拦截,可以对访问操作进行统一的处理。类似拦截器的作用
new Proxy(target, hander)
_**params**_
{ object } target 使用 Proxy 代理的目标对象_**params**_
{ object } hander 定义代理行为的对象_**return**_
{ object } 代理对象实例
var arr = [1, 2, 3, 4, 5];
var proxy = new Proxy(arr, {
get(array, key) {
return array[key] * 2;
},
set(array, key, value) {
array[key] = value;
}
});
proxy[5] = 100;
console.log(proxy[1]); // 4
console.log(arr); // [1, 2, 3, 4, 5, 100]