多个空白变量声明的区别

时间:2015-01-11 13:23:19

标签: javascript object

文字对象方法:

var objectA = {}; 
var objectB = {};

VS

var objectA = objectB = {};

构造函数对象方法:

var objectA = new Object();
var objectB = new Object();

VS

var objectA = objectB = new Object();

5 个答案:

答案 0 :(得分:1)

实际上,当你这样做时

var objectA = {}; 
var objectB = {};

var objectA = new Object();
var objectB = new Object();

您正在创建两个不同的JavaScript对象,它们由objectAobjectB引用。但是当你做的时候

var objectA = objectB = {};

var objectA = objectB = new Object();

您实际上只创建了一个对象,同时让objectAobjectB引用同一个对象。

您可以通过检查两个对象是否相同来确认这一点,例如

var objectA = {}, objectB = {};
console.log(objectA === objectB);
// false
var objectC = objectD = {};
console.log(objectC === objectD);
// true

注意:

var objectC = objectD = {};

将像这样进行评估

var objectC = (objectD = {});

这就是为什么objectCobjectD都引用相同的对象。

重要提示: 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 = {}而言,objAobjB共享对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();

此处objectAobjectB都指向同一个对象。 首先,您要创建一个对象并将其分配给objectAobjectB,因此两者都将具有已创建对象的引用。

在这种情况下

objectA == objectB //return true

注意: -

如果要创建具有相同引用的两个对象,请在两行(如bellow

)中进行
var objectA = new Object();
var objectB = objectA;

因为你不应该不必要地弄乱你的全球范围。