美文网首页
深入理解ES6:10.改进数组的功能

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

作者: 独木舟的木 | 来源:发表于2020-03-19 00:55 被阅读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() 方法:返回查找到的值的索引;

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

...

相关文章

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

    创建数组 创建数组的几种方式: 调用 Array 构造函数; 数组字面量语法; Array.of() 方法; Ar...

  • JS基础之ES6 数组的改进

    数组是一种基础的JavaScript对象。ES6标准继续改进数组,添加了很多功能。 一、 创建数组 在es6以前,...

  • ES6学习-10.改进的数组功能

    1、Array.of()方法 例如下面的代码: 如果不使用上面的方法初始化,那么在ES5中会出现这种情况,如下: ...

  • ES6 数组新用法(一)

    《深入理解ES6》阅读随笔 在 ES6 中,对数组功能进行了扩展。可以使用新增的 Array.of() 和 Arr...

  • 一些常用的代理陷阱函数(六)

    《深入理解ES6》阅读随笔 数组代理 在 ES6 之前,在 JavaScript 中是无法直接创建数组对象的,但是...

  • 深入理解es6(附代码-中)

    深入理解es6 ES6 第五章:数组的空位 数组的空位,数组的某个索引位置没有任何值,undefined不是空位 ...

  • es6-数组新增功能与改进

    数组 es6加入了一些数组的新功能,以及改进了旧功能 保证永远传的是数组的元素 将类对象转换成数组的方式 映射转换...

  • ES6中的Set集合

    在ES6中,出现了新的概念:Set集合和Map集合。在ES6之前,数组是JS中唯一的集合类型。如果对数组有深入理解...

  • 【ES6 笔记】改进的数组功能

    最近工作上突然忙了,也没时间一行行敲代码了,就把数组这一章的脑图列出来吧...

  • 对象解构

    《深入理解ES6》阅读随笔 在 ES6 中,对于解构对象做了一系列改进,使其用起来更加方面。 提取对象字面量:在 ...

网友评论

      本文标题:深入理解ES6:10.改进数组的功能

      本文链接:https://www.haomeiwen.com/subject/hxmvwctx.html