创建数组
创建数组的几种方式:
- 调用 Array 构造函数;
- 数组字面量语法;
-
Array.of()
方法; -
Array.from()
方法;
Array.of()
方法
令人困惑的 Array
构造函数:
// 如果给 Array 构造函数传入一个数值型的值,那么数组的 length 属性会被设为该值。
let items = new Array(2);
console.log(items.length); // 2
console.log(items[0]); // undefined
console.log(items[1]); // undefined
// 如果传入一个非数值类型的值,那么这个值会成为目标数组中的唯一项
items = new Array('2');
console.log(items.length); // 1
console.log(items[0]); // 2
// 如果传入多个值,无论这些值是不是数值类型的值,都会变为数组的元素
items = new Array(1, 2);
console.log(items.length); // 2
console.log(items[0]); // 1
console.log(items[1]); // 2
items = new Array(3, '2');
console.log(items.length); // 2
console.log(items[0]); // 3
console.log(items[1]); // 2
ECMAScript 6 通过引入 Array.of()
方法来解决上述问题。Array.of()
与 Array
构造函数的工作机制类似,只是不存在单一数值型参数值的特例,无论有多少参数,无论参数是什么类型的, Array.of()
方法总会创建一个包含所有参数的数组。以下是一些 Array.of()
方法的调用示例:
// 创建包含两个数字的数组
let items = Array.of(1, 2);
console.log(items.length); // 2
console.log(items[0]); // 1
console.log(items[1]); // 2
// 包含一个数字的数组
items = Array.of(2);
console.log(items.length); // 1
console.log(items[0]); // 2
// 包含一个字符串的数组
items = Array.of('2');
console.log(items.length); // 1
console.log(items[0]); // 2
这与数组字面量的使用方法很相似,在大多数时候,可以用数组字面量来创建原生数组,但如果需要给一个函数传入 Array
的构造图数,则你可能更希望传入 Array.of()
来确保行为一致:
// 参数一:数组创造者函数
// 参数二:要插入数组中的值
function createArray(arrayCreater, value) {
return arrayCreater(value);
}
let items = createArray(Array.of, value)
Array.from()
方法
JavaScript 不支持直接将非数组对象转换为真实数组,arguments
就是一种类数组对象,如果要把它当作数组使用则必须先转换为该对象的类型。
版本一:在 ECMAScript 5 中,可能需要编写如下函数来把类数组对象转换为数组:
function makeArray(arrayLike) {
// 1.手动创建一个 result 数组
var result = [];
// 2.将 arguments 对象里的每一个元素复制到新数组中
for (let index = 0; index < arrayLike.length; index++) {
result.push(arrayLike[index]);
}
return result;
}
function doSomething() {
var args = makeArray(arguments);
// 使用 args
}
版本二:调用数组原生的 slice()
方法可以将非数组对象转换为数组:
function makeArray(arrayLike) {
// 将 slice() 方法执行时的 this 设置为类数组对象
return Array.prototype.slice.call(arrayLike);
}
function doSomething() {
var args = makeArray(arguments);
// 使用 args
}
版本三:ECMAScript 6 新增了 Array.from()
方法可以将对象转换为数组。
Array.from()
方法可以接受可迭代对象或类数组对象作为第一个参数,最终返回一个数组。
function doSomething() {
var args = Array.from(arguments);
// 使用 args
}
映射转换
如果想要进一步转化数组,可以提供一个映射函数作为 Array.from()
的第二个参数,这个函数用来将类数组对象中的每一个值转换成其他形式,最后将这些结果储存在结果数组的相应索引中。请看以下示例:
function translate() {
// 映射函数:value => value + 1
// 数组中的每个元素在存储前都会被加 1
return Array.from(arguments, value => value + 1);
}
let numbers = translate(1, 2, 3);
console.log(numbers); // [ 2, 3, 4 ]
如果用映射函数处理对象,也可以给 Array.from()
方法传递第三个参数来表示映射函数的 this
值。
let helper = {
diff: 1,
add(value) {
return value + this.diff;
}
};
function translate() {
return Array.from(arguments, helper.add, helper);
}
let numbers = translate(1, 2, 3);
console.log(numbers); // [ 2, 3, 4 ]
find()
方法和 findIndex()
方法
-
find()
方法:返回查找到的值; -
findIndex()
方法:返回查找到的值的索引;
find()
方法和 findIndex()
方法都接受两个参数:
- 参数一:回调函数;
- 参数二:可选参数,指定回调函数中的
this
值。
let numbers = [25, 30, 35, 40, 45];
console.log(numbers.find(n => n > 33)); // 35
console.log(numbers.findIndex(n => n > 33)); // 2
fill()
方法
fill()
方法会用指定的值填充一至多个数组元素。
// -----------------------------------
let numbers = [25, 30, 35, 40, 45];
numbers.fill(1);
console.log(numbers.toString()); // 1,1,1,1,1
// -----------------------------------
let numbers = [25, 30, 35, 40, 45];
// 参数 2 表示从索引 2 开始填充元素
numbers.fill(1, 2);
console.log(numbers.toString()); // 25,30,1,1,1
// -----------------------------------
let numbers = [25, 30, 35, 40, 45];
// 指定开始索引和结束索引
numbers.fill(0, 1, 3);
console.log(numbers.toString()); // 25,0,0,40,45
copyWithin()
方法
copyWithin()
方法从数组中复制元素的值。
复制数组中前两个元素中的值到后两个元素中:
let numbers = [25, 30, 35, 40, 45];
// 从索引 2 开始粘贴值
numbers.copyWithin(2, 0);
console.log(numbers.toString()); // 25,30,25,30,35
默认情况下, copyWithin()
会一直复制直到数组末尾的值,但是你可以提供可选的第三个参数来限制被重写元素的数量。第三个参数是不包含结束索引,用于指定停止复制值的位置。在代码中它是这样的:
let numbers = [25, 30, 35, 40, 45];
// 从数组索引 2 开始粘贴值
// 从数组索引 0 开始复制值
// 当位于索引 1 时停止复制值
numbers.copyWithin(2, 0, 1);
console.log(numbers.toString()); // 25,30,25,40,45
定型数组
定型数组是一种用于处理数值类型数据的专用数组。定型数组可以为 JavaScript 提供快速的按位运算。
所谓定型数组,就是将任何数字转换为一个包含数字比特的数组,随后就可以通过我们熟悉的 JavaScript 数组方法来进一步处理。
...
网友评论