声明定义
数组是对象,是引用类型(传址类型)
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); // 5console.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); // 3console.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); // 4console.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); // 2console.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); // 2console.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); // trueconsole.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); // 4console.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); // falseconsole.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); // trueconsole.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); // trueconsole.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]); // 4console.log(arr); // [1, 2, 3, 4, 5, 100]
