您好,登录后才能下订单哦!
ES6(ECMAScript 2015)是JavaScript语言的一次重大更新,引入了许多新特性,其中数组的扩展是开发者们非常关注的部分。ES6为数组新增了多个实用的方法,这些方法极大地简化了数组的操作,提升了开发效率。本文将详细介绍ES6中数组新增的方法及其使用场景。
Array.from()
Array.from()
方法用于将两类对象转换为真正的数组:类似数组的对象(array-like object)和可遍历的对象(iterable object)。
Array.from(arrayLike[, mapFn[, thisArg]])
arrayLike
: 想要转换成数组的类数组对象或可迭代对象。mapFn
(可选): 映射函数,用于对每个元素进行处理。thisArg
(可选): 执行 mapFn
时的 this
值。// 将类数组对象转换为数组
let arrayLike = { 0: 'a', 1: 'b', 2: 'c', length: 3 };
let arr = Array.from(arrayLike); // ['a', 'b', 'c']
// 使用映射函数
let arr2 = Array.from([1, 2, 3], x => x * 2); // [2, 4, 6]
arguments
对象转换为数组。NodeList
或 HTMLCollection
转换为数组。Array.of()
Array.of()
方法用于将一组值转换为数组。
Array.of(element0[, element1[, ...[, elementN]]])
let arr = Array.of(1, 2, 3); // [1, 2, 3]
let arr2 = Array.of(7); // [7]
new Array()
构造函数在传入单个数字参数时的歧义问题。// new Array(3) 会创建一个长度为3的空数组
let arr = new Array(3); // [empty × 3]
// Array.of(3) 会创建一个包含单个元素3的数组
let arr2 = Array.of(3); // [3]
Array.prototype.copyWithin()
copyWithin()
方法用于将数组的一部分复制到同一数组中的另一个位置,并返回该数组,而不修改其大小。
arr.copyWithin(target[, start[, end]])
target
: 复制到的目标位置(索引)。start
(可选): 开始复制的起始位置(索引),默认为0。end
(可选): 结束复制的结束位置(索引),默认为数组长度。let arr = [1, 2, 3, 4, 5];
arr.copyWithin(0, 3, 4); // [4, 2, 3, 4, 5]
Array.prototype.find()
find()
方法用于查找数组中第一个满足条件的元素,并返回该元素。如果没有找到符合条件的元素,则返回 undefined
。
arr.find(callback[, thisArg])
callback
: 用于测试每个元素的函数,接受三个参数:
element
: 当前元素。index
(可选): 当前元素的索引。array
(可选): 调用 find
的数组。thisArg
(可选): 执行 callback
时的 this
值。let arr = [1, 2, 3, 4, 5];
let found = arr.find(element => element > 3); // 4
Array.prototype.findIndex()
findIndex()
方法用于查找数组中第一个满足条件的元素的索引,并返回该索引。如果没有找到符合条件的元素,则返回 -1
。
arr.findIndex(callback[, thisArg])
callback
: 用于测试每个元素的函数,接受三个参数:
element
: 当前元素。index
(可选): 当前元素的索引。array
(可选): 调用 findIndex
的数组。thisArg
(可选): 执行 callback
时的 this
值。let arr = [1, 2, 3, 4, 5];
let index = arr.findIndex(element => element > 3); // 3
Array.prototype.fill()
fill()
方法用于将数组的所有元素填充为指定的值。
arr.fill(value[, start[, end]])
value
: 用来填充数组的值。start
(可选): 开始填充的起始位置(索引),默认为0。end
(可选): 结束填充的结束位置(索引),默认为数组长度。let arr = [1, 2, 3, 4, 5];
arr.fill(0, 2, 4); // [1, 2, 0, 0, 5]
Array.prototype.includes()
includes()
方法用于判断数组是否包含某个特定的值,返回 true
或 false
。
arr.includes(valueToFind[, fromIndex])
valueToFind
: 需要查找的值。fromIndex
(可选): 开始查找的起始位置(索引),默认为0。let arr = [1, 2, 3, 4, 5];
let hasThree = arr.includes(3); // true
Array.prototype.flat()
flat()
方法用于将嵌套的数组“拉平”,变成一维数组。
arr.flat([depth])
depth
(可选): 指定要提取嵌套数组的结构深度,默认值为1。let arr = [1, [2, [3, [4]]]];
let flatArr = arr.flat(2); // [1, 2, 3, [4]]
Array.prototype.flatMap()
flatMap()
方法首先使用映射函数映射每个元素,然后将结果压缩成一个新数组。
arr.flatMap(callback[, thisArg])
callback
: 用于映射每个元素的函数,接受三个参数:
element
: 当前元素。index
(可选): 当前元素的索引。array
(可选): 调用 flatMap
的数组。thisArg
(可选): 执行 callback
时的 this
值。let arr = [1, 2, 3];
let result = arr.flatMap(x => [x * 2]); // [2, 4, 6]
Array.prototype.entries()
entries()
方法返回一个新的数组迭代器对象,该对象包含数组中每个索引的键值对。
arr.entries()
let arr = ['a', 'b', 'c'];
let iterator = arr.entries();
for (let [index, value] of iterator) {
console.log(index, value);
}
// 0 'a'
// 1 'b'
// 2 'c'
Array.prototype.keys()
keys()
方法返回一个新的数组迭代器对象,该对象包含数组中每个索引的键。
arr.keys()
let arr = ['a', 'b', 'c'];
let iterator = arr.keys();
for (let key of iterator) {
console.log(key);
}
// 0
// 1
// 2
Array.prototype.values()
values()
方法返回一个新的数组迭代器对象,该对象包含数组中每个索引的值。
arr.values()
let arr = ['a', 'b', 'c'];
let iterator = arr.values();
for (let value of iterator) {
console.log(value);
}
// 'a'
// 'b'
// 'c'
Array.prototype[Symbol.iterator]
Symbol.iterator
是一个内置的符号,用于定义对象的默认迭代器。数组的 Symbol.iterator
方法返回一个迭代器对象,该对象可以用于遍历数组。
arr[Symbol.iterator]()
let arr = ['a', 'b', 'c'];
let iterator = arr[Symbol.iterator]();
for (let value of iterator) {
console.log(value);
}
// 'a'
// 'b'
// 'c'
Array.prototype[Symbol.unscopables]
Symbol.unscopables
是一个内置的符号,用于定义对象的哪些属性在 with
语句中不可用。
arr[Symbol.unscopables]
let arr = [1, 2, 3];
console.log(arr[Symbol.unscopables]);
// { copyWithin: true, entries: true, fill: true, find: true, findIndex: true, flat: true, flatMap: true, includes: true, keys: true, values: true }
with
语句中的属性可见性。Array.prototype[Symbol.species]
Symbol.species
是一个内置的符号,用于定义对象的构造函数,该构造函数用于创建派生对象。
arr[Symbol.species]
class MyArray extends Array {
static get [Symbol.species]() { return Array; }
}
let myArr = new MyArray(1, 2, 3);
let mapped = myArr.map(x => x * 2);
console.log(mapped instanceof MyArray); // false
console.log(mapped instanceof Array); // true
Array.prototype[Symbol.toPrimitive]
Symbol.toPrimitive
是一个内置的符号,用于定义对象的原始值转换行为。
arr[Symbol.toPrimitive](hint)
hint
: 表示期望的转换类型,可以是 "number"
、"string"
或 "default"
。let arr = [1, 2, 3];
arr[Symbol.toPrimitive] = function(hint) {
if (hint === 'number') {
return this.reduce((a, b) => a + b, 0);
}
if (hint === 'string') {
return this.join(', ');
}
return this;
};
console.log(+arr); // 6
console.log(`${arr}`); // '1, 2, 3'
Array.prototype[Symbol.toStringTag]
Symbol.toStringTag
是一个内置的符号,用于定义对象的默认字符串描述。
arr[Symbol.toStringTag]
let arr = [1, 2, 3];
console.log(arr.toString()); // '1,2,3'
console.log(arr[Symbol.toStringTag]); // 'Array'
Array.prototype[Symbol.isConcatSpreadable]
Symbol.isConcatSpreadable
是一个内置的符号,用于定义对象在 concat
方法中是否应该展开。
arr[Symbol.isConcatSpreadable]
let arr = [1, 2, 3];
arr[Symbol.isConcatSpreadable] = false;
let newArr = [].concat(arr); // [[1, 2, 3]]
concat
方法中的展开行为。Array.prototype[Symbol.match]
Symbol.match
是一个内置的符号,用于定义对象的 match
方法。
arr[Symbol.match](string)
string
: 要匹配的字符串。let arr = [1, 2, 3];
arr[Symbol.match] = function(string) {
return string.split(',').map(Number);
};
console.log('1,2,3'.match(arr)); // [1, 2, 3]
match
方法。Array.prototype[Symbol.replace]
Symbol.replace
是一个内置的符号,用于定义对象的 replace
方法。
arr[Symbol.replace](string, replacement)
string
: 要替换的字符串。replacement
: 替换的内容。let arr = [1, 2, 3];
arr[Symbol.replace] = function(string, replacement) {
return string.split(',').map(Number).join(replacement);
};
console.log('1,2,3'.replace(arr, '-')); // '1-2-3'
replace
方法。Array.prototype[Symbol.search]
Symbol.search
是一个内置的符号,用于定义对象的 search
方法。
arr[Symbol.search](string)
string
: 要搜索的字符串。let arr = [1, 2, 3];
arr[Symbol.search] = function(string) {
return string.split(',').indexOf('2');
};
console.log('1,2,3'.search(arr)); // 1
search
方法。Array.prototype[Symbol.split]
Symbol.split
是一个内置的符号,用于定义对象的 split
方法。
arr[Symbol.split](string, limit)
string
: 要分割的字符串。limit
(可选): 分割的最大次数。let arr = [1, 2, 3];
arr[Symbol.split] = function(string, limit) {
return string.split(',').slice(0, limit);
};
console.log('1,2,3'.split(arr, 2)); // ['1', '2']
split
方法。Array.prototype[Symbol.toPrimitive]
Symbol.toPrimitive
是一个内置的符号,用于定义对象的原始值转换行为。
arr[Symbol.toPrimitive](hint)
hint
: 表示期望的转换类型,可以是 "number"
、"string"
或 "default"
。let arr = [1, 2, 3];
arr[Symbol.toPrimitive] = function(hint) {
if (hint === 'number') {
return this.reduce((a, b) => a + b, 0);
}
if (hint === 'string') {
return this.join(', ');
}
return this;
};
console.log(+arr); // 6
console.log(`${arr}`); // '1, 2, 3'
Array.prototype[Symbol.toStringTag]
Symbol.toStringTag
是一个内置的符号,用于定义对象的默认字符串描述。
arr[Symbol.toStringTag]
let arr = [1, 2, 3];
console.log(arr.toString()); // '1,2,3'
console.log(arr[Symbol.toStringTag]); // 'Array'
Array.prototype[Symbol.unscopables]
Symbol.unscopables
是一个内置的符号,用于定义对象的
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。