Array.from([1,3,10,5], x => x + x); // [2,6,20,10]
[1,2,10,5].from( x => x + x); // TypeError
[1,3,10,5].pop(); // 5
为什么以不同的方式调用不同的Array方法?
答案 0 :(得分:2)
from
函数存在于Array
对象本身中。所以你需要通过Array
实例来调用它。您还可以创建一个new Array
或[]
与Array
不同的数组。创建数组时,它与Array
实例的功能无关。它只引用其原型链中的Array.prototype
,从中获取length
或pop
等函数和属性。通常说Array.prototype
中的内容 - 可以从数组([]
)访问,Array
实例本身的内容 - 不是,您需要通过Array
调用它们实例
答案 1 :(得分:1)
在第二种情况下,您希望map
使用要应用于每个元素的函数返回已修改的数组。
[1,2,10,5].map(x => x + x); // [2,6,20,10]
在我看来,这实际上就是你想要的。
Array.from
的更多解释。
这是一个'静态'函数,这意味着它不能像你在第二行中尝试的那样应用于实际的数组实例,它只能用在类 {{1 }}。换句话说,它是Javascript术语,它不属于Array
。
来自docs的说明解释函数的用途:
来自:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from
Array.from()允许您从:
创建数组类似数组的对象(具有length属性和索引的对象 元素)或可迭代对象(可以获取其元素的对象, 例如Map和Set)。
Array.from()有一个可选参数mapFn, 它允许你对每个元素执行map函数 正在创建的数组(或子类对象)。
更清楚, Array.from(obj,mapFn,thisArg)具有相同的结果 Array.from(obj).map(mapFn,thisArg),除了它不创建 中间阵列。
因此,在您的情况下,Array.prototype
的使用似乎不如简单地使用Array.from(yourArray, mapFunc)
那么明确,因为使用Array.from的真正兴趣是当不<时/ em>有一个数组,但可以变成数组的东西。
在这种情况下,将mapFunction作为第二个参数也很方便,以避免首先创建临时数组,然后将元素映射到新的最终数组。
答案 2 :(得分:1)
鉴于arr
的实例Array
,arr.method
相当于Array.prototype.method
。
注意那里的.prototype
!
因此arr.pop()
与Array.prototype.pop.call(arr)
相同。但是,Array.from
中没有prototype
,它是直接在Array构造函数本身上的方法,并且不能(使用数组实例)轻松访问。
如果您熟悉其他面向对象语言(Java,C#等),Array.from
本质上是一个静态方法,而Array.prototype.pop
本质上是一个实例方法。