深入理解ES6:10.改进数组的功能

2020-03-19  本文已影响0人  独木舟的木

创建数组

创建数组的几种方式:

  1. 调用 Array 构造函数;
  2. 数组字面量语法;
  3. Array.of() 方法;
  4. 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() 方法都接受两个参数:

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 数组方法来进一步处理。

...

上一篇 下一篇

猜你喜欢

热点阅读