文字对象方法:
var objectA = {};
var objectB = {};
VS
var objectA = objectB = {};
构造函数对象方法:
var objectA = new Object();
var objectB = new Object();
VS
var objectA = objectB = new Object();
答案 0 :(得分:1)
实际上,当你这样做时
var objectA = {};
var objectB = {};
或
var objectA = new Object();
var objectB = new Object();
您正在创建两个不同的JavaScript对象,它们由objectA
和objectB
引用。但是当你做的时候
var objectA = objectB = {};
或
var objectA = objectB = new Object();
您实际上只创建了一个对象,同时让objectA
和objectB
引用同一个对象。
您可以通过检查两个对象是否相同来确认这一点,例如
var objectA = {}, objectB = {};
console.log(objectA === objectB);
// false
var objectC = objectD = {};
console.log(objectC === objectD);
// true
注意:强>
var objectC = objectD = {};
将像这样进行评估
var objectC = (objectD = {});
这就是为什么objectC
和objectD
都引用相同的对象。
重要提示: As dfsq mentions in the comment,在最后一个示例中,objectD
将泄露到全局范围。所以,避免使用这种模式。
答案 1 :(得分:0)
第一种方法创建一个对象并将其引用分配给变量。然后它创建另一个对象并将其引用分配给另一个变量。
第二种方法创建一个对象并将其引用分配给变量。然后它将同一对象的另一个引用分配给另一个变量。
答案 2 :(得分:0)
这些都是一样的; {}
创建了一个新的Object
:
var a = {};
var b = new Object();
如果将对象的相同实例(空或其他)分配给两个变量,它们都将引用同一个实例。
var b;
var a = b = {}
a.Foo = 'foo';
// "foo"
alert(b.Foo);
如果为每个实例创建不同的实例,它们将引用不同的实例:
var b = {};
var a = {};
a.Foo = 'foo';
// ""
alert(b.Foo);
如果您使用类似整数的值类型执行其中一个链式赋值,那么它们将以实现相关的方式不同,但由于整数没有可以更改的属性,因此它不是问题。我花了一些时间用于旧的Netscape< C源代码。 4 JavaScript引擎在第一次发布源代码时回来了。整数存储在指针本身中,左移一位或两位并以最低位标记(分配的存储器在四字节边界上对齐,因此这两位在有效指针上始终为零)。 IIRC Gnu Common Lisp也是这样做的。
答案 3 :(得分:0)
就new Object()
和{}
而言,两者都会产生一个Object 实例。
就var objA = objB = {}
而言,objA
和objB
共享对Object 实例的相同引用,但在分配时则不是这种情况他们分开。
答案 4 :(得分:0)
第一个案例
当你这么说时
var objectA = {};
var objectB = {};
或
var objectA = new Object();
var objectB = new Object();
您正在创建两个不同的对象。如果你要比较两个对象
objectA == objectB //return false
第二种情况
当你说
时var objectA = objectB = {};
或
var objectA = objectB = new Object();
此处objectA
和objectB
都指向同一个对象。 首先,您要创建一个对象并将其分配给objectA
和objectB
,因此两者都将具有已创建对象的引用。
在这种情况下
objectA == objectB //return true
注意: - 强>
如果要创建具有相同引用的两个对象,请在两行(如bellow
)中进行var objectA = new Object();
var objectB = objectA;
因为你不应该不必要地弄乱你的全球范围。