Array.method和[] .method

时间:2018-04-19 11:58:47

标签: javascript

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方法?

3 个答案:

答案 0 :(得分:2)

from函数存在于Array对象本身中。所以你需要通过Array实例来调用它。您还可以创建一个new Array[]Array不同的数组。创建数组时,它与Array实例的功能无关。它只引用其原型链中的Array.prototype,从中获取lengthpop等函数和属性。通常说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的实例Arrayarr.method相当于Array.prototype.method

注意那里的.prototype

因此arr.pop()Array.prototype.pop.call(arr)相同。但是,Array.from中没有prototype,它是直接在Array构造函数本身上的方法,并且不能(使用数组实例)轻松访问。

如果您熟悉其他面向对象语言(Java,C#等),Array.from本质上是一个静态方法,而Array.prototype.pop本质上是一个实例方法。