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

Jon*_*alk 359 javascript arrays object new-operator javascript-objects

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

var objectA = {}
var objectB = new Object()
Run Code Online (Sandbox Code Playgroud)

脚本引擎如何处理它们有什么不同吗?有没有理由使用一个而不是另一个?

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

var arrayA = []
var arrayB = new Array()
Run Code Online (Sandbox Code Playgroud)

Már*_*son 447

对象

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

为了定义空对象,它们在技术上是相同的.该{}语法是短,整齐(不以Java-ISH),并让你瞬间填充对象内联-就像这样:

var myObject = {
        title:  'Frog',
        url:    '/img/picture.jpg',
        width:  300,
        height: 200
      };
Run Code Online (Sandbox Code Playgroud)

数组

对于数组来说,使用new Array();over 也几乎没有任何好处[];- 只有一个小例外:

var emptyArray = new Array(100);
Run Code Online (Sandbox Code Playgroud)

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

我的推荐

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

  • 即使您使用Array(100)语法,同一个数组在第101个位置也未定义; 这个数字唯一真正做的就是改变length属性的值. (21认同)
  • 另外,要注意`new Array(1,2,3)`会导致`[1,2,3]`,但是`new Array(1)`会导致`[1]` 因此,"数组"的语义不一致,不必要地混淆. (10认同)
  • @Pablo我不知道你的论点是什么.像Douglas Crockford一样,我建议使用`[]`.那里没有争论.但是,你认为`new Array(100)`在某种程度上是"无效的",这是不真实的. (9认同)
  • @Pablo对于`new Array(100)`没有任何意义.阅读文献:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array (6认同)
  • OP询问有关创建空对象的问题.Guillermo在创建非空对象时指出了差异,这是正确的但不完全是OP所要求的. (2认同)
  • `new Array(len).fill(0);` (2认同)
  • 我要补充说`Object.create(null)`对于创建空白对象很有用,而`{}`继承自Object原型. (2认同)

小智 88

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

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

var objectB = new Object() //This is the object constructor
Run Code Online (Sandbox Code Playgroud)

在JS中,一切都是一个对象,但你应该知道新的Object()有以下几点:它可以接收一个参数,并且根据该参数,它将创建一个字符串,一个数字或一个空对象.

例如:new Object(1),将返回一个数字.new Object("hello")将返回一个字符串,这意味着对象构造函数可以委托 - 取决于参数 - 对象创建到其他构造函数,如字符串,数字等...当您管理动态数据时,请务必记住这一点非常重要创建对象..

许多作者建议您不要使用对象构造函数,而是可以使用某种文字符号,在那里您将确保您创建的内容是您希望在代码中具有的内容.

我建议你进一步阅读javascript上的文字符号和构造函数之间的差异,以找到更多细节.


Jas*_*ing 12

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

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

最终,它将取决于情况和偏好.


Bob*_*ack 8

var objectA = {}
Run Code Online (Sandbox Code Playgroud)

根据我的经验,使用起来要快得多,所以最好采用"标准"并节省一些打字.

  • 此外,文字通常在分析时创建,而"新对象"必须在运行时执行. (2认同)

bob*_*nce 8

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

我的手指仍默认说新的Array(),但我是一个非常老的人.值得庆幸的是,Netscape 3不是今天很多人都要考虑的浏览器......

  • Netscape 3?男人,那是在上一个*世纪*!:-D (11认同)
  • 我不得不把这个答案吹掉灰尘才能看到它,因为它太旧了! (2认同)

The*_*ker 8

我相信{}这里的一个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 || '';
}
Run Code Online (Sandbox Code Playgroud)

然后就像这样使用:

var aMammal = new Mammal('Me warm-blooded');
var name = aMammal.get_name();
Run Code Online (Sandbox Code Playgroud)

使用{}as的另一个好处new Object是可以使用它来执行JSON样式的对象文字.


Kar*_*son 7

数组实例化性能

如果您希望创建一个没有长度的数组:

var arr = []; 比...更快 var arr = new Array();

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

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

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

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