【问题标题】:Object Notation vs. Curly Bracket Notation对象表示法与大括号表示法
【发布时间】:2015-09-10 16:38:45
【问题描述】:

以下属性设置和 JavaScript 中的对象声明在性能或功能上是否存在差异?

var a = {
  b: 'A property',
  c: 1
};

对比

var a = {};
a.b = 'A property';
a.c = 1;

而且,如果我要清除一个对象的所有属性,以下哪个更好,为什么?

var a = {};

对比

a.b = undefined;
a.c = undefined;

谢谢!

【问题讨论】:

  • 关于性能相关的问题——jsperf.com 是一个很好的在浏览器中测试 JS 性能的工具。
  • 这会成为您应用程序的瓶颈吗?
  • 他要求“性能功能”。 《什么宇宙》完全无关紧要。有时,“知道这一切”的无知优越感会让我在这个网站上感到恼火。

标签: javascript object javascript-objects


【解决方案1】:

对象声明/扩展它

  • 花括号表示法是一个对象字面量声明。
  • 没有属性的简单大括号就像Object.create(null):一个原型为Object的空对象。

关于删除属性。

  • 将其他空对象(即{})设置为包含对象引用的变量只是重用相同的引用并使其指向新对象。

  • 将现有对象属性设置为undefined 不等于删除属性。您只是将 undefined 设置为它们的值,因为在 JavaScript 中 undefined 是一个可能的值。

要删除属性,您需要使用delete 语句:

Object.keys(obj).forEach(function(propertyName) {
    // This really deletes the property from the object
    delete obj[propertyName];
});

【讨论】:

  • Object.create(null) 没有原型。
  • «没有属性的简单大括号就像Object.create(null)»是什么意思? IE。试试这个:a = {}; b = Object.create(null); 这里b 将有 nothinga 有所有 proto 属性。 (即__proto__, constructor, toString, ...
【解决方案2】:

要清除属性,最好使用var a = {},因为这样您就不会对设置的属性做出假设。即使在a 中添加了一些其他属性,您也可以保证是一个空对象。

对于设置属性,这并不重要。如果对象属性设置一次后未更改,那么在一次操作中分配对象及其所有属性会更清楚地表明您的意图。

【讨论】:

    【解决方案3】:

    声明: 我看不出功能上的区别。对于性能声明,我需要进行可能特定于引擎的测量。我预计没有区别,但这只是猜测,因此可以衡量。

    清算: 你在这里做了两件不同的事情:

    • a = {};a 的值替换为一个空对象,没有 属性(默认属性除外)
    • a.property = undefined; 将属性的值替换为 undefined,保留属性但将它们标记为未设置 一个适当的值。

    这似乎是一个品味问题,取决于 位置以及其他代码是否依赖于现有的属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多