js--数组的 Array.of() 和 Array.from() 方法的使用总结

前言

  JavaScript 中数组的本质是一个对象,它存在的 length 属性值随数组元素的长度变化,但是开发中经常会遇到拥有 length 属性和若干索引属性的对象,被称为类数组对象,类数组对象和数组类似,但是不能调用数组的方法。Array.from()方法解决了这一问题,将类数组转化为数组,本文就来总结一下 Array.of()  和Array.from()  的相关知识。

正文

  1、Array.of()

  首先来对比一下普通创建数组的方法:

    var ar1 = new Array(2)
    console.log(ar1.length, ar1) //2 [empty,empty] (empty表示空位)
    var ar2 = new Array(1, 2, 3, 4)
    console.log(ar2.length, ar2) //4   [1,2,3,4]
    var ar3 = new Array("2")
    console.log(ar3.length, ar3) //1  ["2"]

  上面的代码中当使用单个数值参数来调用构造函数创建数据的时候,该数值会默认成为数组的长度;如果使用多项数据作为参数,这些参数会成为数组的项;而使用单个非数值类型的参数来调用,该参数会成为数组的唯一项。通过调用构造函数来创建数组,无法确定传入的参数是数组的长度还是具体的每一项,因此,ES6 针对这一点做了优化,提供了 Array.of () 方法。

  Array.of() 方法创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型。使用方法与构造函数类似,如下:

    var ar1 = Array.of(3)
    console.log(ar1); //[3]
    var ar2 = Array.of("3")
    console.log(ar2); //["3"]
    var ar3 = Array.of(undefined)
    console.log(ar3); //undefined

  区别:Array.of() 和 Array 构造函数之间的区别在于处理整数参数:Array.of(3) 创建一个具有单个元素 3 的数组,而 Array(3) 创建一个长度为 3 的空数组(注意:这是指一个有 3 个空位 ( empty ) 的数组,而不是由 3 个 undefined 组成的数组)。

 

  2、Array.from()

  Array.from()  方法从一个类似数组或可迭代对象(内部有Symbol.iterator迭代器)创建一个新的,浅拷贝的数组实例并返回。

  语法:Array.from ( arrayLike [,  mapFn [,  thisArg ] ] ),Array.from()  方法接收三个参数,其中第一个arrayLike 表示想要转化成数组的伪数组对象或者可迭代对象,第二个参数 mapFn 为可选参数,指定新数组中每个元素都执行的回调函数,相当于执行了一边map遍历,第三个参数 thisArg 为可选参数,表示执行第二个回调函数时的 this 对象。

  (1)Array.from 转化 arguments类数组对象为数组

  首先对比一下没有Array.from() 方法之前的转化方法:

    function makeArray(arrayLike) {
      var resultArr = []
      for (let i = 0; i < arrayLike.length; i++) {
        resultArr.push(arrayLike[i])
      }
      return resultArr
      //或者return Array.prototype.slice.call(arrayLike);
    }
    function doSomething() {
      console.log(arguments);
      var args = makeArray(arguments)
      console.log(args);
    }
    doSomething("a", "b")
    // Arguments(2)["a","b",length:2...]
    // ["a","b"]

  基于上面的问题,ES6 优化后的便利方法如下:同样,除了arguments对象类似数组外,常用的还有 DOM 节点类数组 nodeList 等。

    function doSomething() {
      var args = Array.from(arguments)
      console.log(args);
    }
    doSomething("a", "b")//["a","b"]

  

  (2)Array.from()  不仅可以用于类数组对象,也可以用于迭代对象,这意味着该方法可以将任意Symbol.iterator 属性的对象转化为数组。

    var numbers = {
      *[Symbol.iterator]() {
        yield 1;
        yield 2;
        yield 3;
      }
    };
    var numbers2 = Array.from(numbers, (value) => value + 1);
    console.log(numbers2); // [2,3,4]

  

  (3)除此之外,Array.from() 还有其他使用方法,如下:

     // 将字符串转化为数组
    var str = 'foo'
    console.log(Array.from(str)); //['f','o','o']
    // 将Set集合转化为数组
    var set = new Set([1, 1, 2, 3, 4])
    console.log(Array.from(set));//  [1, 2, 3, 4]  数组去重
    // 将map 集合转化为数组
    var map = new Map([['1', 'a'], ['2', 'b']])
    console.log(Array.from(map)); // [['1', 'a'], ['2', 'b']]
    console.log(Array.from(map.keys()));// ['1','2']
    console.log(Array.from(map.values())); // ['a','b']
    // 传入第二个参数
    var arr = [1, 2, 3]
    console.log(Array.from(arr, x => x * 2));//[2, 4, 6]
    // 数组浅复制(拷贝)
    var arr1 =[{name:"name"},{age:"age"}]
    var arr2 = Array.from(arr1)
    console.log(arr2);//[{name:"name"},{age:"age"}]
    arr1[0].name = "new Nmae"
    console.log(arr1);// [{name:"new Nmae"},{age:"age"}]
    console.log(arr2);// [{name:"new Nmae"},{age:"age"}]

 

写在最后

  以上就是本文的全部内容,希望给读者带来些许的帮助和进步,方便的话点个关注,小白的成长之路会持续更新一些工作中常见的问题和技术点。

 

posted @ 2021-11-10 17:53  zaisy'Blog  阅读(1744)  评论(0编辑  收藏  举报