【问题标题】:Create an empty object in JavaScript with {} or new Object()?使用 {} 或 new Object() 在 JavaScript 中创建一个空对象?
【发布时间】:2010-09-20 01:35:58
【问题描述】:

在 JavaScript 中创建空对象有两种不同的方法:

var objectA = {}
var objectB = new Object()

脚本引擎处理它们的方式有什么不同吗?有什么理由使用其中一个吗?

同样,也可以使用不同的语法创建一个空数组:

var arrayA = []
var arrayB = new Array()

【问题讨论】:

  • 警告:有一个小的差异可能会导致非常恼人的错误!在 Object 原型中创建一个将其分配给“{}”的空对象将是由“new”运算符创建的每个 Object 实例中的相同 Object 实例。当你使用“new Object({})”时,你会有不同的实例。
  • 值得一提的是,除了var objectA = {} var objectB = new Object(),还有第三个构造会产生相同的结果:var objectC = Object.create(Object.prototype);
  • {}[] 使用 {} 而不是 new Object()。使用[] 而不是new Array()。当成员名称是连续整数时使用数组。当成员名称是任意字符串或名称时使用对象。 source
  • new Object(){} 不是完全空的对象,它们是具有 Object.prototype 的对象。您可以将 Object.create(null) 用于真正的空对象(至少根据 mozilla 文档:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

标签: javascript arrays object javascript-objects new-operator


【解决方案1】:

这本质上是一样的。使用任何你觉得更方便的东西。

【讨论】:

  • 也许我在这里对javascript的研究太深了,但它们是一样的吗? Object 的 {proto} 不是 null,而 {} 的 {proto} 是 'Object.prototype' 吗?
  • @Izhaki Object 的原型为空,没错。那是因为Object 终止了原型链。对象 instances 但是没有原型,只有构造函数有。还有(new Object()).constructor === ({}).constructor -> true
  • 那么this 不正确?
  • 这是我的观点:new Object() 产生一个空白对象实例。 {} 产生一个空白对象实例。这两种情况是绝对无法区分的。您链接到的示例做了其他事情(它修改了原型链)并且在这里并不真正适用 - 或者我不理解您的论点。
【解决方案2】:

这些具有相同的最终结果,但我只想补充一点,使用文字语法可以帮助人们习惯 JSON 的语法(JavaScript 文字对象语法的字符串化子集),所以这可能是一个好习惯进入。

另一件事:如果您忘记使用new 运算符,您可能会遇到一些细微的错误。因此,使用文字将帮助您避免这个问题。

最终,这将取决于情况和偏好。

【讨论】:

    【解决方案3】:
    var objectA = {}
    

    速度更快,并且根据我的经验,更常用,因此最好采用“标准”并节省一些输入。

    【讨论】:

    • 运行更快还是输入更快?
    • 好吧,诚然,我的意思是“输入”,但考虑到额外的解析时间,执行起来也可能稍微快一点:-)
    • 此外,文字通常在解析时创建,而new Object 必须在运行时执行。
    【解决方案4】:

    对象和数组字面量语法 {}/[] 是在 JavaScript 1.2 中引入的,因此在 4.0 之前的 Netscape Navigator 版本中不可用(并且会产生语法错误)。

    我的手指仍然默认说 new Array(),但我是一个很老的人。值得庆幸的是,Netscape 3 并不是当今许多人不得不考虑的浏览器...

    【讨论】:

    • 网景 3?伙计,那是在上一个世纪! :-D
    • 我不得不在这个答案上吹灰尘才能看到它太老了!
    【解决方案5】:

    我相信{}here 上的一个 Javascript 视频中被推荐为良好的编码约定。 new 是伪经典继承所必需的。 var obj = {}; 方式有助于提醒您,这不是一种经典的面向对象语言,而是一种原型语言。因此,您真正需要new 的唯一时间是您使用构造函数时。例如:

    var Mammal = function (name) {
      this.name = name;
    };
    
    Mammal.prototype.get_name = function () {
      return this.name;
    }
    
    Mammal.prototype.says = function() {
      return this.saying || '';
    }
    

    那么它就是这样使用的:

    var aMammal = new Mammal('Me warm-blooded');
    var name = aMammal.get_name();
    

    使用{}new Object 相反的另一个优点是您可以使用它来执行JSON 样式的对象文字。

    【讨论】:

      【解决方案6】:

      对象

      使用new Object(); 没有任何好处 - 而{}; 可以使您的代码更紧凑、更易读。

      对于定义空对象,它们在技术上是相同的。 {} 语法更短、更整洁(更少 Java 风格),并允许您立即内联填充对象 - 如下所示:

      var myObject = {
              title:  'Frog',
              url:    '/img/picture.jpg',
              width:  300,
              height: 200
            };
      

      数组

      对于数组,与 []; 相比,使用 new Array(); 几乎没有任何好处 - 除了一个小例外:

      var emptyArray = new Array(100);
      

      创建一个包含 undefined 的所有插槽的 100 项长数组 - 这在某些情况下可能很好/有用(例如 (new Array(9)).join('Na-Na ') + 'Batman!')。

      我的建议

      1. 永远不要使用new Object(); - 它比{}; 更笨重,而且看起来很傻。
      2. 始终使用[]; - 除非您需要快速创建具有预定义长度的“空”数组。

      【讨论】:

      • 即使您使用 Array(100) 语法,第 101 位的同一个数组也没有定义; number 真正做的唯一一件事就是改变 length 属性的值。
      • @Pablo new Array(100) 没有什么无效的。阅读文献:developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
      • @Pablo 我不知道你的论点是什么。像 Douglas Crockford 一样,我推荐使用 []。那里没有争论。但是,您认为new Array(100) 在某种程度上是“无效的”,这是不正确的。
      • 另外,请注意new Array(1,2,3) 会导致[1,2,3],但new Array(1) 确实not 会导致[1];因此,Array 的语义不一致且造成不必要的混乱。
      • 我要补充一点,Object.create(null) 可用于创建空白对象,而 { } 继承自 Object 原型。
      【解决方案7】:

      是的,有区别,它们不一样。确实,您会得到相同的结果,但引擎对它们的工作方式不同。其中一种是对象字面量,另一种是构造函数,两种在 javascript 中创建对象的不同方式。

      var objectA = {} //This is an object literal
      
      var objectB = new Object() //This is the object constructor
      

      在 JS 中一切都是对象,但是你应该注意 new Object() 的以下几点:它可以接收一个参数,并且根据该参数,它将创建一个字符串、一个数字或只是一个空对象。

      例如:new Object(1),将返回一个数字。 new Object("hello") 将返回一个字符串,这意味着对象构造函数可以根据参数将对象创建委托给其他构造函数,如字符串、数字等...在管理时记住这一点非常重要动态数据来创建对象..

      当您可以使用某种文字符号时,许多作者建议不要使用对象构造函数,这样您可以确定您正在创建的内容就是您期望在代码中包含的内容。

      我建议您进一步阅读javascript上文字符号和构造函数之间的区别以找到更多详细信息。

      【讨论】:

      • 文字符号实际上更易读,更简洁,可以创建动态数据对象。
      【解决方案8】:

      数组实例化性能

      如果你想创建一个没有长度的数组:

      var arr = [];var arr = new Array();

      如果你想创建一个具有一定长度的空数组:

      var arr = new Array(x);var arr = []; arr[x-1] = undefined 快;

      对于基准,请单击以下内容:https://jsfiddle.net/basickarl/ktbbry5b/

      我不知道两者的内存占用,我可以想象new Array() 占用更多空间。

      【讨论】:

      • arr = new Array(x) 等价于arr = []; arr.length = x;,而不是用undefined 分配x-1 索引。
      【解决方案9】:

      好的,只有两种不同的方法可以做同样的事情!一个叫object literal,另一个是函数constructor

      但请继续阅读,我想分享几件事:

      使用{} 使您的代码更具可读性,同时创建Object 的实例或其他不推荐的内置函数...

      此外,Object 函数获取参数,因为它是一个函数,例如 Object(params)... 但 {} 是在 JavaScript 中启动对象的纯粹方式...

      使用对象字面量可以让您的代码看起来更简洁,其他开发人员也更容易阅读,而且它符合 JavaScript 的最佳实践...

      虽然 Javascript 中的对象几乎可以是任何东西,但 {} 只指向 javascript 对象,为了测试它是如何工作的,请在您的 javascript 代码或控制台中执行以下操作:

      var n = new Object(1); //Number {[[PrimitiveValue]]: 1}
      

      令人惊讶的是,它正在创建一个数字!

      var a = new Object([1,2,3]); //[1, 2, 3]
      

      这是创建一个数组!

      var s = new Object('alireza'); //String {0: "a", 1: "l", 2: "i", 3: "r", 4: "e", 5: "z", 6: "a", length: 7, [[PrimitiveValue]]: "alireza"}
      

      String 的这个奇怪结果!

      所以如果你正在创建一个对象,建议使用对象字面量,有一个标准的代码,避免像上面那样的任何代码事故,在我的经验中使用{} 的性能也更好!

      【讨论】:

      • 你是Dezfooli?在伊朗?
      • 嗨,Ehsan,是的,但我不住在伊朗,伙计,你在这里的个人资料很棒!很高兴认识你...
      • 我可以保存您的电话号码并在编程方面向您寻求帮助吗?
      • 我看到你使用电报。
      • 是的,当然,我们可以在电报上分享一些知识! ___
      【解决方案10】:
      Var Obj = {};
      

      这是最常用也是最简单的方法。

      使用

      var Obj = new Obj() 
      

      不是首选。

      没有必要使用new Object()

      为了简单、可读性和执行速度,使用第一个(对象字面量方法)。

      【讨论】:

      • 这如何回答最初的问题? “脚本引擎处理它们的方式有什么不同吗?有什么理由使用一个而不是另一个吗?”
      • 不需要使用 new Object()。为了简单、可读性和执行速度,使用第一个(对象字面量方法)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 2023-04-09
      • 2011-09-14
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      相关资源
      最近更新 更多