在 JavaScript 中使用 {} 或 new Object() 创建一个空对象?

Create an empty object in JavaScript with {} or new Object()?

提问人:Jonas Pegerfalk 提问时间:10/31/2008 最后编辑:AlirezaJonas Pegerfalk 更新时间:2/12/2023 访问量:723766

问:

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

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

脚本引擎处理它们的方式有什么区别吗?有什么理由使用一个而不是另一个?

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

var arrayA = []
var arrayB = new Array()
JavaScript 数组对象 javascript-objects new-operator

评论

7赞 peterh 1/16/2015
警告:有一个细微的差异可能会导致非常烦人的错误!在 Object 原型中创建一个空对象并将其分配给“{}”,在由“new”运算符创建的每个 Object 实例中,将是相同的 Object 实例。当你使用“new Object({})”时,你会有不同的实例。
0赞 kalitsov 9/26/2016
值得一提的是,除了第三种结构之外,还有第三种结构将产生相同的结果:var objectA = {} var objectB = new Object()var objectC = Object.create(Object.prototype);
0赞 ilgaar 6/3/2017
{}和 Use 而不是 。使用 代替 。当成员名称是连续整数时,使用数组。当成员名称是任意字符串或名称时,请使用对象。[]{}new Object()[]new Array()
2赞 10/7/2019
new Object()并且不是完全空的对象,它们是具有 Object.prototype 的对象。你可以用于一个真正的空对象(至少根据mozilla文档:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...{}Object.create(null))

答:

2赞 Tomalak 10/31/2008 #1

这本质上是一回事。使用任何您认为更方便的东西。

评论

0赞 Izhaki 5/9/2014
也许我在这里深入研究了 javascript,但它们是一样的吗?的 {proto} 不是 null 吗,而 的 {proto} 是 'Object.prototype' 吗?Object{}
0赞 Tomalak 5/9/2014
@Izhaki 的原型是空的,这是正确的。那是因为终止了原型链。但是,对象实例没有原型,只有构造函数才有原型。和ObjectObject(new Object()).constructor === ({}).constructor -> true
0赞 Izhaki 5/9/2014
所以这是不正确的吗?
0赞 Tomalak 5/9/2014
这是我的观点:产生一个空白的 Object 实例。 生成一个空白的 Object 实例。这两种情况都是绝对无法区分的。您链接到的示例做了其他事情(它修改了原型链),并且在这里并不真正适用 - 或者我不明白您的论点。new Object(){}
14赞 Jason Bunting 10/31/2008 #2

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

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

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

10赞 Bobby Jack 10/31/2008 #3
var objectA = {}

速度要快得多,而且根据我的经验,更常用,所以最好采用“标准”并节省一些打字时间。

评论

1赞 hippietrail 1/9/2012
运行速度更快还是打字速度更快?
0赞 Bobby Jack 1/10/2012
好吧,诚然,我的意思是“输入”,但是,考虑到额外的解析时间,执行速度可能也会稍微快一点:-)
2赞 Phrogz 4/26/2012
此外,文本通常在解析时创建,而必须在运行时执行。new Object
8赞 bobince 10/31/2008 #4

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

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

评论

13赞 Tomalak 10/31/2008
网景3?伙计,那是在上个世纪!:-D
2赞 basickarl 11/2/2021
我不得不在这个答案上吹灰尘才能看到它,因为它太老了!
8赞 Thedric Walker 10/31/2008 #5

我相信在这里的一个 Javascript 视频中被推荐为一个很好的编码约定。 是伪经典继承所必需的。该方式有助于提醒您,这不是一种经典的面向对象语言,而是一种原型语言。因此,您真正需要的唯一时间是当您使用构造函数时。例如:{}newvar 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();

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

513赞 Már Örlygsson 10/31/2008 #6

对象

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

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

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

阵 列

对于数组来说,同样,使用超过也几乎没有任何好处——除了一个小例外:new Array()[]

var emptyArray = new Array(100);

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

我的建议

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

评论

24赞 Jason Bunting 10/31/2008
即使您使用 Array(100) 语法,同一个数组在第 101 位的 undefined 中也有 undefined;该数字真正要做的就是更改 length 属性的值。
6赞 Már Örlygsson 8/21/2011
@Pablo没有什么无效的.阅读文献:developer.mozilla.org/en/JavaScript/Reference/Global_Objects/...new Array(100)
9赞 Már Örlygsson 8/23/2011
@Pablo我不知道你的论点是什么。像 Douglas Crockford 一样,我建议使用 .那里没有争论。然而,你认为这在某种程度上是“无效的”,这是不真实的。[]new Array(100)
11赞 Dancrumb 12/29/2014
另外,请注意,结果为 ,但不会导致 ;因此,的语义不一致且不必要地混淆。new Array(1,2,3)[1,2,3]new Array(1)[1]Array
4赞 Meow 9/16/2016
我想补充一点,这对于创建空白对象很有用,而继承自 Object 原型。Object.create(null){ }
105赞 Guillermo Snipe 4/14/2011 #7

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

var objectA = {} //This is an object literal

var objectB = new Object() //This is the object constructor

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

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

许多作者建议不要使用对象构造函数,因为你可以改用特定的文字表示法,这样你就可以确保你正在创建的内容是你期望在代码中包含的内容。

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

评论

1赞 Sid 8/6/2017
实际上,文字表示法在创建动态数据对象方面更具可读性和简洁性。
0赞 Ali Hassan Cheema 11/5/2022
非常注重细节的评论。你不是为了它而放代码。相反,试图解释差异和何时使用哪个语句的重要事情。谢谢!
9赞 basickarl 8/6/2016 #8

数组实例化性能

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

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

如果要创建具有一定长度的空数组:

var arr = 新数组(x);比 var 快 arr = []; arr[x-1] = undefined;

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

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

评论

0赞 Bergi 5/1/2018
arr = new Array(x)等价于 ,而不是用 分配索引。arr = []; arr.length = x;x-1undefined
2赞 Alireza 7/9/2017 #9

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

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

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

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

使用对象文字使你的代码看起来更干净,更易于其他开发人员阅读,并且它与 JavaScript 中的最佳实践一致......

虽然 Javascript 中的 Object 几乎可以是任何东西,但仅指向 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

因此,如果您正在创建对象,建议使用对象字面量,以具有标准代码并避免任何如上所述的代码事故,而且根据我的经验,性能明智的使用更好!{}

评论

0赞 Ehsan 7/9/2017
你是Dezfooli?在伊朗?
0赞 Alireza 7/9/2017
嗨,Ehsan,是的,但我不住在伊朗,伙计,你在这里有很好的个人资料!见到你很高兴。。。
0赞 Ehsan 7/9/2017
我可以保存您的电话号码并从您那里获得有关编程的帮助吗?
0赞 Ehsan 7/9/2017
我看到你用电报。
0赞 Alireza 7/9/2017
是的,当然,我们肯定可以在电报上分享一些知识!___
4赞 Amit Singh 12/4/2020 #10
Var Obj = {};

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

var Obj = new Obj() 

不是首选。

没有必要使用 .new Object()

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

评论

0赞 Zsolt Meszaros 12/4/2020
这如何回答最初的问题?“脚本引擎处理它们的方式有什么区别吗?有什么理由使用一个而不是另一个吗?
0赞 Amit Singh 12/4/2020
无需使用 new Object()。为了简单、可读性和执行速度,请使用第一个方法(对象文本方法)。