根据文档 here ,Array.of()
是 new Array()
的替代方法,它允许您在运行时创建数组文字,即使它只有一个元素(一种情况new Array() 崩溃了)。我喜欢这样,并且已经用 .of()
替换了对我的自定义 Array 子类的大多数 new()
调用,但是自从转换后,我现在在尝试某些事情时发现错误.
该链接声称 .of()
等同于此:
Array.of = function() { return Array.prototype.slice.call(arguments); }
为了检查这是否属实,我编写了这个测试来比较真实的 of()
和那个 polyfill:
Array.of_polyfill = function( ...args ) // Fake of().
{
console.log( args );
return Array.prototype.slice.call( args );
}
class A extends Array // So we can peek inside what the real of() is doing.
{
constructor( ...args ) // Using of() on an "A" calls this constructor.
{
console.log( args );
return Array.prototype.slice.call( args );
}
}
var a1 = A.of ( 5,6,7,8 );
var a2 = A.of_polyfill( 5,6,7,8 );
a1 和 a2 最终都包含正确的值 [5,6,7,8]
,但在内部使用这两行是不一致的,如控制台日志所示:
[4]
(4) [5, 6, 7, 8]
从那里的第一行开始,调用 .of()
并没有导致整个文字都在范围内,而只是 [4]
,就好像它在内部调用一样A
构造函数预分配四个插槽,这不是 polyfill 提到的事情。
我关心内部行为,因为 of()
的主要建议用途之一是自定义数组子类,如我上面的 A
,允许我指定数组文字我的新类型。为此,我的 A
构造函数应该能够使用文字(传入的参数)执行手动操作,但由于上述原因,它无法访问它。是否有其他方式可以让我访问?
of()
的建议 polyfill 是否准确,还是我误解了 JavaScript 和构造函数的某些方面?
最佳答案
要点... Array.of
允许您创建一个数组,而不是“数组文字”。 “文字”是指允许您使用其初始化数据(如果有)描述和创建数组的语法,例如 var a = [1, 2, 3]
。
最终,文档并未声明 polyfill 完全等效。 MDN 是一个 wiki,所以如果可以改进 polyfill,那么欢迎任何人贡献更改。请记住,尽管它有望在 ES5 和更低版本中工作,因此接近完整的子类化行为将需要更多的工作。
关于javascript - Array.of() 没有按照 es6 中的规定工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45653119/