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
为什么不同的数组方法以不同的方式调用?
from
函数存在于Array
对象本身中。因此,您需要通过Array
实例调用它。您还可以使用不同于Array
的new Array
或[]
创建数组。创建数组时,它与Array
实例的功能无关。它只引用其原型链中的Array.prototype
,从中获取函数和属性,例如length
或pop
。一般来说,Array.prototype
中的内容 - 可以从数组([]
)访问,Array
实例本身中的内容 - 不是,您需要通过Array
实例调用它们。
给定一个实例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
本质上是一个实例方法。
在第二种情况下,您希望map
使用要应用于每个元素的函数返回修改后的数组。
[1,2,10,5].map(x => x + x); // [2,6,20,10]
在我看来,这实际上是你想要的。
关于Array.from
的更多解释。
这是一个"静态"的函数,这意味着它不能像您在第二行中尝试的那样应用于实际的数组实例,它只能在类Array
上使用。否则用Javascript术语来说,它不是Array.prototype
的一部分。
文档中的描述解释了函数的用途:
寄件人 : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from
Array.from() 允许您从以下位置创建数组:
类似数组的对象(具有长度属性和索引的对象 元素)或可迭代对象(您可以在其中获取其元素的对象, 如地图和设置)。
Array.from() 有一个可选的参数 mapFn, 这允许您对 正在创建的数组(或子类对象)。
更清楚的是, Array.from(obj, mapFn, thisArg) 的结果与 Array.from(obj).map(mapFn, thisArg),除了它不创建一个 中间阵列。
因此,在您的情况下,使用Array.from(yourArray, mapFunc)
似乎不如简单地使用youArray.map(mapFunc)
那么清楚,因为使用 Array.from 的真正兴趣是当您没有数组,而是可以转换为数组的东西时。
在这种情况下,将 mapFunction 作为第二个参数也很方便,以避免先创建一个临时数组,然后将元素映射到新的最终数组。