在 JavaScript 中,创建一个空对象有两种不同的方式:
var objectA = {}
var objectB = new Object()
脚本引擎在处理它们时有区别吗?有没有使用一个而不是另一个的原因?
同样,也可以使用不同的语法创建空数组:
var arrayA = []
var arrayB = new Array()
在 JavaScript 中,创建一个空对象有两种不同的方式:
var objectA = {}
var objectB = new Object()
脚本引擎在处理它们时有区别吗?有没有使用一个而不是另一个的原因?
同样,也可以使用不同的语法创建空数组:
var arrayA = []
var arrayB = new Array()
使用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!'
)。
new Object();
——它比{}
更笨重,看起来很傻。[]
——除非你需要快速创建一个具有预定义长度的“空”数组。new Array(100)
并没有任何问题。请阅读文献:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array - Már Örlygsson[]
。在这一点上没有争议。但是你认为new Array(100)
是无效的,这是不正确的。 - Már Örlygssonnew Array(1,2,3)
的结果是 [1,2,3]
,但 new Array(1)
的结果并不是 [1]
;因此,Array
的语义不一致且令人困惑。 - DancrumbObject.create(null)
可以用于创建一个空对象,而 { }
则继承自 Object 原型。 - Meow是的,它们有区别,它们不相同。虽然你会得到相同的结果,但引擎对它们的处理方式不同。其中一个是对象字面量,另一个则是构造函数,两种在JavaScript中创建对象的不同方法。
var objectA = {} //This is an object literal
var objectB = new Object() //This is the object constructor
在JS中,一切皆为对象,但你需要了解以下关于new Object()的事情:它可以接收一个参数,根据该参数的不同,它将创建一个字符串、一个数字或仅仅是一个空对象。new Object(1)
将返回一个Number。new Object("hello")
将返回一个字符串。这意味着对象构造函数可以根据参数委托给其他构造函数(如string、number等)来创建对象。当你管理动态数据以创建对象时,牢记这一点非常重要。这两种方法的最终结果相同,但我建议使用字面量语法,因为它可以帮助人们熟悉JSON的语法(一种JavaScript字面对象语法的字符串化子集),所以这可能是一个好习惯。
另外需要注意的是,如果忘记使用new
运算符,可能会导致一些微妙的错误。因此,使用字面量可以避免这个问题。
最终,选择哪种方法取决于具体情况和个人偏好。
var objectA = {}
更快速,而且在我的经验中更常用,因此最好采用这个“标准”以节省打字时间。
new Object
必须在运行时执行。 - Phrogz如果你想创建一个没有长度的数组:
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;
,而不是将 x-1
索引赋值为 undefined
。 - Bergi我相信在这里的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 风格的对象字面量。Var Obj = {};
var Obj = new Obj()
不建议使用new Object()
。
为了简单易读且执行速度更快,请使用第一个方法(对象字面量方法)。
好的,只有两种不同的方法来完成同一件事情!其中一个叫做对象字面量
,而另一个是一个构造函数
!
但请继续阅读,我想分享几件事情:
使用{}
使您的代码更易读,而创建Object
或其他内置函数的实例则不建议使用...
此外,Object函数作为函数获得参数,如Object(params)
...但{}
是在JavaScript中启动对象的纯方式...
在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
的这个奇怪结果!
因此,如果您正在创建一个对象,建议使用对象字面量,以获得标准代码并避免以上类似的代码事故,从性能上来说,根据我的经验,使用{}
更好!
这本质上是相同的事情。使用您发现更方便的任何内容。
Object
的{proto}不是null,而{}
的{proto}是'Object.prototype'吗? - IzhakiObject
的原型是 null,这是正确的。这是因为 Object
终止了原型链。然而,Object
的实例没有原型,只有构造函数才有一个。并且 (new Object()).constructor === ({}).constructor
-> true
。 - Tomalaknew Object()
会产生一个空的对象实例。{}
也会产生一个空的对象实例。这两个实例是完全无法区分的。你提供的示例做了其他事情(它修改了原型链),并且在这里并不适用 - 或者我没有理解你的论点。 - Tomalak
var objectA = {} var objectB = new Object()
还有第三种构造方式可以产生相同的结果:var objectC = Object.create(Object.prototype);
- kalitsov{}
代替new Object()
。使用[]
代替new Array()
。当成员名称为连续整数时,请使用数组。当成员名称为任意字符串或名称时,请使用对象。来源 - ilgaarnew Object()
和{}
并不是完全空的对象,它们是具有 Object.prototype 的对象。您可以使用Object.create(null)
来创建一个真正的空对象(至少根据 Mozilla 文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create)。 - user9903