【问题标题】:Javascript: Object.create(null) For Arrays (Array.create(null) Equivalent)Javascript:Object.create(null) 用于数组(Array.create(null) 等效)
【发布时间】:2017-06-19 20:03:45
【问题描述】:

用空白原型初始化对象很容易:Object.create(null)。但是,数组没有像对象那样方便的Array.create 方法。那么,Object.create 的数组等价物是什么?

关于结果数组的访问速度*,初始化空白数组的最佳方法是什么?或者,所述空白数组的访问速度*是否会比定期[]初始化数组的访问速度*慢?

非常感谢任何和所有建设性的回应。


*“访问速度”是指从数组中读取和写入属性的速度。

【问题讨论】:

  • 在 JS 中数组是对象,但是是特殊类型的对象。他们的length 属性将它们与普通对象区分开来,即使您喜欢a = []; a[10] = "whatever";,也会刷新。所以数组实例化最好通过字面意义上的[] 或通过调用Array 函数作为工厂或构造函数来完成。
  • 数组对 JS 至关重要,而 JavaScript 引擎经过专门定制,可以尽可能提高性能。如果你开始定制,绕着阵列的工作方式走,你肯定会得到更差的性能。
  • 如前所述,不要摆弄基本的对象和数组。 {} 和 [] 完全可以接受、完全可读、高度优化等。哦,上帝,请不要在我必须测试创建空对象或数组的函数的地方编写代码!

标签: javascript arrays object prototype proto


【解决方案1】:

使用空白(或任何其他自定义)原型创建数组是没有意义的。 Object.create(null) 的用例是一个地图1,其中没有原型会干扰属性,但数组及其整数索引没有这个问题。
如果你坚持这样做,

Object.setPrototypeOf([], null)

会实现这一点,但会创建一个非常奇怪的对象,它会破坏许多期望数组具有某些方法的代码。

或者,该空白数组中的属性访问速度会比定期初始化的数组慢吗?

是的,很可能 - 奇怪 对象总是很有可能没有像标准对象那样被优化。无论如何,它不会更快。

1:当然,它们现在已经被true Maps 弃用了。

【讨论】:

  • 非常感谢您的建设性回复。这正是我想要的。
  • 我创建了一个 JS 性能:jsperf.com/different-ways-of-creating-arrays/1 你的惊人方式似乎比new Array 快得多,这显然比经典的[] 还要快。
  • 我不认为这是“引人注目的”。初始化 sn-p 也被破坏了。还有never trust microbenchmarks.
  • 初始化 sn-p 不会在 IE、Safari 或 Opera 中工作,因为我懒得让它普遍兼容,只是为了一个基准。尝试使用chrome,然后它会工作。
  • 是的,你是绝对正确的,通常情况下,它会优化它。这就是我使用void: 告诉浏览器不要退出代码的原因。
【解决方案2】:

没有理由不使用[] 创建数组。从技术上讲,您可以调用new Array(),但实际上它与[] 相同。

在幕后,Array 真的只是一个Object,以数字作为键和一些特殊的逻辑来确保键顺序(Object 在技术上没有,尽管Object 通常确实保持它的键订单,这不是保证)。

虽然您在技术上可以使用Object.create(null) 来创建自己的 Array 实现,但它的性能远不如内置 Array,因为大多数引擎都会有特殊代码来提高其性能。

【讨论】:

  • 非常感谢您的建设性回复,但是我正在寻找是否可以在没有原型的情况下创建数组,以便浏览器不必进行额外检查以查看您的索引是否正在访问是一个非数字方法,如indexOf
  • @3.1415926535897932384626433833 这个小小的检查是如此微不足道,以至于几乎没有性能影响(在个位数纳秒范围内),即使在通常不适合在解释中使用的巨大数据集上也是如此没有直接记忆控制的语言。使用内置 Array 以外的任何东西作为数组总是会差很多。这与实现您自己的 Number 类而不是使用内置类相同。
  • 我也是这么想的,直到我创建并查看了这个 jsPerf:jsperf.com/different-ways-of-creating-arrays/1
  • 当我运行它们时,前三个返回的结果几乎完全相同。第二个 2 是最低的。即使创建速度更快,您的读/写速度也会慢得多,那是在您实际对它们进行任何操作之前。更不用说仅仅理解愚蠢的额外负担。
猜你喜欢
  • 2020-10-23
  • 1970-01-01
  • 2011-03-31
  • 2023-03-29
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 2023-04-09
相关资源
最近更新 更多