javascript - Array.of() 没有按照 es6 中的规定工作?

标签 javascript arrays ecmascript-6

根据文档 hereArray.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/

相关文章:

javascript - jSTL : foreach loop setting values to a hidden variable returns zero always

javascript - 我不明白我的 Javascript 代码有什么问题

arrays - 如何使用 gson/retrofit 获取对象数组?

python - 在Python(可能是pandas)中从文件读取数组时,处理和跳过第一行(包含元数据)的优雅方法?

javascript - 类中的 Pre ES6 静态函数

Javascript const 关键字的使用方式不同

javascript - 如何在javascript类中制作静态数组?

javascript - 将递归算法转换为迭代算法的困难

javascript - 如何在最后一次出现时删除数组中的部分字符串

javascript - 为什么我的 img 在我硬编码 src URL 时显示,但在我以编程方式分配它时却不显示?