奇怪的使用Array.of()和Array.from()?

时间:2016-01-13 06:30:10

标签: javascript arrays ecmascript-6

ArrayES6Array.of()中有Array.from()两种新方法。在page中提到了它们的不同用法。

但是,我对此line

Array.of的使用感到困惑
// usage of Array.of
console.log(
    Array.of( "things", "that", "aren't", "currently", "an", "array" )
); // ["things", "that", "aren't", "currently", "an", "array"]

如果我们按以下方式执行该操作,

console.log(
    [ "things", "that", "aren't", "currently", "an", "array" ]
); // ["things", "that", "aren't", "currently", "an", "array"]

我们可以获得与console.log(Array.of(...))相同的结果。在这里使用Array.of的任何好处?

还与此line

Array.from的使用相混淆
var divs = document.querySelectorAll("div");
console.log(
    Array.from( divs )
);

如果上述代码中没有Array.from,该怎么办?

var arr = [1, 2, 3];
console.log(Array.from(arr)); // [1, 2, 3]
console.log(arr); // [1, 2, 3]

在这里使用Array.from的任何好处?

1 个答案:

答案 0 :(得分:5)

Array.of()

Brendan eich说(Source):

  

Dmitry A. Soshnikov写道:

     
    

Brendan Eich写道:

         
      

所以Array.of的目标是提供一个与之不同的构造函数       数组,没有Array(42)的疯狂特例,其中       预设长度(以及预分配实现的提示)但是       在[0,长度]留下洞。

    
         

我仍然没有看到它在手动枚举中会有什么帮助     可以直接传递给数组初始化器括号的项目。     我们在这里列举(手工)项目,对吗? - Array.of(1, 2, 3)。和     我们在这里枚举项目(也用手) - [1, 2, 3]。区别     是第二种情况在语法上更优雅和含糖     也不需要分配不需要的功能激活     call-stack frame等。

  
     

这一切都是真的,但除此之外。用例是你不能的时候   写一个文字,因为你传递的函数 - 构造为   一个funarg,最终的调用者只能通过一个数字arg,或   几个args。在这种情况下,Array将不会做正确的事情   一号arg案例。

     

这就是Array.of的原因。

示例:

// Array.of(42) creates an array with a single element, 42, whereas Array(42) creates an array with 42 elements, each of which is undefined.
console.log(new Array(42));
console.log(Array.of(42));

Array.from()

Array.from()方法从类似数组或可迭代对象创建一个新的Array实例。

  1. 类似数组的对象(具有length属性和索引元素的对象)
  2. 可迭代对象(可以获取其元素的对象,例如Map和Set)。
  3. 例如:

    var m = new Map([[1, 2], [2, 4], [4, 8]]);
    console.log("m is:");
    console.log(m);
    
    var _from = Array.from(m);
    console.log("After .from: ");
    console.log(_from);