美文网首页
深入理解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.改进数组的功能

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