Array.of()和Array.from()的用法怪异?

zan*_*ngw 1 javascript arrays ecmascript-6

有两个新的方法ArrayES6Array.of()Array.from()本页中将介绍它们的不同用法。

但是,我Array.of对这一行的用法感到困惑

// usage of Array.of
console.log(
    Array.of( "things", "that", "aren't", "currently", "an", "array" )
); // ["things", "that", "aren't", "currently", "an", "array"]
Run Code Online (Sandbox Code Playgroud)

如果我们按照以下方式去做,

console.log(
    [ "things", "that", "aren't", "currently", "an", "array" ]
); // ["things", "that", "aren't", "currently", "an", "array"]
Run Code Online (Sandbox Code Playgroud)

我们可以得到与相同的结果console.log(Array.of(...))Array.of在这里使用有什么好处吗?

也混淆了Array.from的用法

var divs = document.querySelectorAll("div");
console.log(
    Array.from( divs )
);
Run Code Online (Sandbox Code Playgroud)

如果Array.from以上代码中没有该怎么办。

var arr = [1, 2, 3];
console.log(Array.from(arr)); // [1, 2, 3]
console.log(arr); // [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

Array.from在这里使用有什么好处吗?

voi*_*oid 5

Array.of()

布伦丹·艾希(Brendan eich)说(来源):

德米特里·A·索什尼科夫写道:

布伦丹·艾希(Brendan Eich)写道:

因此,Array.of的目标是提供一个构造函数,该构造函数与Array不同,它没有Array(42)那样疯狂的特殊情况,它可以预先设置长度(并暗示要进行预分配的实现),但会在[0,length)中留下漏洞。

我仍然看不到它将如何手动枚举可能直接传递到数组初始化程序括号的相同项目。我们在这里枚举(手工)物品,对不对?- Array.of(1, 2, 3)。我们在这里枚举项目(也可以人工进行)- [1, 2, 3]。区别在于,第二种情况在语法上更加优雅和含糖,并且不需要通过分配调用堆栈框架等来激活不需要的函数。

没错,但这很重要。用例是当您无法编写文字时,因为您要传递一个构造为funarg的函数,而最终的调用者只能传递一个数字arg或几个args。在这种情况下,Array在one-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));
Run Code Online (Sandbox Code Playgroud)

Array.from()

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

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

例如:

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);
Run Code Online (Sandbox Code Playgroud)