在javascript中创建空对象有两种不同的方法:
1 2
| var objectA = {}
var objectB = new Object() |
脚本引擎处理它们的方式有什么不同吗?有没有理由把一个用在另一个上面?
同样,也可以使用不同的语法创建空数组:
1 2
| var arrayA = []
var arrayB = new Array() |
- 警告:有一个微小的差异,可能会导致非常刺激的虫子!创建一个空对象,在对象原型中将其分配给""将是由"new"操作符创建的每个对象实例中的相同对象实例。当您使用"新对象()"时,您将拥有不同的实例。
- 值得一提的是,除了var objectA = {} var objectB = new Object()之外,还有第三个构造将产生相同的结果:var objectC = Object.create(Object.prototype);。
- {}和[]使用{}而不是new Object()。用[]代替new Array()。当成员名称为顺序整数时,请使用数组。当成员名称是任意字符串或名称时使用对象。来源
物体
使用new Object();没有好处,而{};可以使代码更紧凑、更可读。
对于定义空对象,它们在技术上是相同的。EDCOX1的1语法是更短的,更整洁的(更少的Java ISH),并且允许您立即填充对象,如:
1 2 3 4 5 6
| var myObject = {
title: 'Frog',
url: '/img/picture.jpg',
width: 300,
height: 200
}; |
数组
对于阵列,使用new Array();比使用[];几乎没有任何好处,只有一个小的例外:
1
| var emptyArray = new Array(100); |
创建一个100项长的数组,其中所有插槽都包含undefined,在某些情况下(如(new Array(9)).join('Na-Na ') + 'Batman!')可能很好/很有用。
我的建议
千万不要使用new Object();,它比更笨重,看起来很傻。
始终使用[];—除非需要快速创建一个具有预定义长度的"空"数组。
- 即使使用数组(100)语法,在第101个位置的同一个数组中也没有定义;数字真正做的唯一事情就是更改长度属性的值。
- 对。新数组(100);这是一种很好的单列方法。啊…我看到我不小心把"重要"这个词留在了…会把它编辑出来。
- Array(100)是错误的,它使数组处于无效状态,因为它的长度是100,它等于[],直到你开始添加东西,不要这样做。
- @帕布罗,埃多克斯1〔11〕没有什么不正确的地方。阅读文献:developer.mozilla.org/en/javascript/reference/global_objects‌&8203;/…
- @M&R从一个知道他在说什么的人那里得到它:javascript.crockford.com/code.html奖金
- @我不知道你的论点是什么。像道格拉斯·克罗克福德一样,我建议使用[]。那里没有争论。然而,你认为new Array(100)在某种程度上是"无效的",这是不真实的。
- 这个"答案"实际上只是一个观点,忽略了吉尔莫所说的实际差异。
- 操作询问如何创建空对象。Guillermo指出了创建非空对象时的区别,这是正确的,但不完全符合OP的要求。
- new Array(len).fill(0);
- 另外,请注意,new Array(1,2,3)导致[1,2,3],但new Array(1)不会导致[1];因此,Array的语义不一致且不必要地混淆。
- 有一个非常重要的区别:如果通过简单地将空对象分配给""来创建空对象,它将是相同的。如果您使用"new object()"创建它,它将是一个不同的对象实例…
- 请注意,可以像这样设置数组的"长度"属性:var a = []; a.length = 10;,这将使数组由10个未定义元素组成。
- 我发现新的object()比更可读。对我来说,说这是愚蠢和愚蠢的听起来是精英主义者。
- 我想补充一下,Object.create(null)对于创建空白对象很有用,而{ }继承了对象原型。
- 关于Object.create(null)的好观点。
是的,有区别,它们不一样。的确,你会得到相同的结果,但引擎的工作方式对两者都不同。其中一个是对象文本,另一个是构造函数,这是用JavaScript创建对象的两种不同方法。
1 2 3
| 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上的文字表示法和构造函数之间的区别,以了解更多详细信息。
- 实际上,文字表示法对于创建动态数据对象更具可读性和简洁性。
这些都有相同的最终结果,但我想简单地补充一下,使用文本语法可以帮助人们习惯JSON的语法(JavaScript文本对象语法的字符串化子集),因此这可能是一个很好的实践。
另一件事是:如果忘记使用new运算符,可能会出现细微的错误。所以,使用文本将帮助您避免这个问题。
最终,这将取决于形势和偏好。
数组实例化性能
如果要创建不带长度的数组:
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指数。
我相信在这里的一个javascript视频中推荐使用{}作为一种良好的编码约定。对于伪经典继承,new是必要的。var obj = {};方法有助于提醒您,这不是经典的面向对象语言,而是原型语言。因此,您真正需要new的唯一时间是使用构造函数函数时。例如:
1 2 3 4 5 6 7 8 9 10 11
| var Mammal = function (name) {
this.name = name;
};
Mammal.prototype.get_name = function () {
return this.name;
}
Mammal.prototype.says = function() {
return this.saying || '';
} |
然后它的用法如下:
1 2
| var aMammal = new Mammal('Me warm-blooded');
var name = aMammal.get_name(); |
与new Object相反,使用{}的另一个优点是可以使用它来执行JSON样式的对象文本。
对象和数组文字语法/[]是在javascript 1.2中引入的,因此在4.0之前的Netscape Navigator版本中不可用(并且会产生语法错误)。
我的手指仍然默认说new array(),但我是一个非常老的人。值得庆幸的是,Netscape 3不是许多人今天必须考虑的浏览器…
- Netscape 3?伙计,那是上个世纪的事了!-D
速度快得多,根据我的经验,更常用,所以最好采用"标准"并保存一些输入。
- 跑得更快还是打字更快?
- 诚然,我的意思是"键入",但考虑到额外的解析时间,可能执行速度也会稍微快一点。
- 此外,文本通常在解析时创建,而new Object必须在运行时执行。
这基本上是一样的。用任何你觉得方便的东西。
- 也许我对javascript的研究太深入了,但它们是相同的吗?Object的proto不是空的,而{}的proto是"object.prototype"吗?
- @伊扎基,Object的原型是空的,这是正确的。这是因为Object终止了原型链。但是,对象实例没有原型,只有构造函数有原型。和(new Object()).constructor === ({}).constructor->true。
- 那么这是不正确的?
- 我的观点是:new Object()生成一个空对象实例。{}生成一个空对象实例。这两种情况完全无法区分。您链接到的示例执行了其他操作(它修改了原型链),但在这里并不真正适用,或者我不理解您的论点。
好吧,有两种不同的方法来做同样的事情!一个叫做object literal,另一个是函数constructor!
但请继续阅读,我想分享以下几点:
使用{}可以提高代码的可读性,同时创建不推荐使用的Object或其他内置函数的实例…
另外,对象函数得到参数,因为它是一个函数,比如Object(params)。但{}是用javascript启动对象的纯方法…
使用object-literal可以使代码看起来更干净,更容易被其他开发人员阅读,并且它与JavaScript中的最佳实践是内联的…
虽然javascript中的对象几乎可以是任何东西,但{}只指向javascript对象,为了测试它的工作方式,请在javascript代码或控制台中执行以下操作:
1
| var n = new Object(1); //Number {[[PrimitiveValue]]: 1} |
令人惊讶的是,它创造了一个数字!
1
| var a = new Object([1,2,3]); //[1, 2, 3] |
这是在创建一个数组!
1
| 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来说是个奇怪的结果!
因此,如果您正在创建一个对象,建议使用对象文字,使用标准代码并避免类似于上面的任何代码事故,使用{}在性能方面更好!
- 你是德兹福利?在伊朗?
- 嗨,爱山,是的,但是我不住在伊朗,伙计,你在这里的形象很好!很高兴认识你。。。
- 我可以把你的电话号码存起来,并向你寻求编程方面的帮助吗?
- 我看见你用电报。
- 是的,当然,我们可以分享一些关于电报的知识。阿尔法
- 很好,我现在给你发个短信。请把我的号码存起来。谢谢你,阿里扎。