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

创建数组

创建数组的几种方式:

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

...

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原创文章&经验总结&从校招到A厂一路阳光一路沧桑 详情请戳www.codercc.com 主要知识点:创建数组、数...
    你听___阅读 4,645评论 0 2
  • 第一章:块级作用域绑定 块级声明 1.var声明及变量提升机制:在函数作用域或者全局作用域中通过关键字var声明的...
    BeADre_wang阅读 4,344评论 0 0
  • 前面的话   数组是一种基础的JS对象,随着时间推进,JS中的其他部分一直在演进,而直到ES5标准才为数组对象引入...
    CodeMT阅读 3,599评论 0 2
  • 1.在C/C++中实现本地方法 生成C/C++头文件之后,你就需要写头文件对应的本地方法。注意:所有的本地方法的第...
    JayQiu阅读 7,022评论 0 3
  • 转载:在开发中,数组的使用场景非常多,平日中也涉及到很多数组的api/相关操作,一直也没有对这块内容进行一块整理总...
    七色烟火阅读 8,485评论 0 3