2011-09-20 102 views
5

JavaScript对象基于值还是基于引用?例如:javascript中的值类型引用类型对象

obj1.list =new array(); 
// ------ populate list 
obj2.list = obj1.list 

是否浏览器进行obj1.list的不同副本obj2.list,或者是obj2.list只是obj1.list参考?

+2

它是基于参考的。 – BoltClock

+1

[Javascript的等号参考对象或克隆它们是否可能的重复](http://stackoverflow.com/questions/7467335/does-javascript-equal-sign-reference-objects-or-clones-them) – RobG

回答

14

JavaScript对象(通过扩展:阵列,正则表达式,日期,非原始字符串/数字/布尔值等等)平等和分配是基于参考:

{a:'a'} == {a:'a'} // false 

但:

var myObject = {a:'a'}; 
var myObject2 = myObject; 

myObject == myObject2 // true 

此外:

myObject.b = 'b'; 

console.log(myObject2.b); // Logs: "b" 
+0

这是没错,但并没有真正解决上述问题。这种比较是错误的,因为它们中的每一个都是独立的对象,并且对象的相等性比较以查看它们是否在内存中是完全相同的对象 - 它不查看对象的内容。 – jfriend00

+0

@ jfriend00 - 我不明白你在说什么。我已经清楚地解释说,评估*和*作业都是基于参考的。 –

+0

我在阅读您的文章时只看到前两行。我不确定你是否编辑了你的答案以增加更多内容,或者因为没有向我展示所有内容。您目前的答案更完整。 – jfriend00

2

分配使得警察只有当它是一个原始类型(如Number,Boolean等)时,该值才是值。否则,赋值只是将引用复制到同一个对象(Object,Array等)。一个新的对象不是通过赋值来创建的。

所以,在你的榜样:

obj1.list =new array(); 
// ------ populate list 
obj2.list = obj1.list 

obj2.push("foo"); 
alert(obj1.pop); // "foo" (they are both the same list) 

obj1.listobj2.list将指向同一个对象(包含同一对象的引用)

3

JavaScript是基于引用语义:

var a = [1,2,3]; 
var b = a; 
a[0] = 42; 
alert(b[0]); // will show 42 
var c = a.slice(); // explicitly makes a copy 
a[1] = 6502; 
alert(c[1]); // will show 2, not 6502 
4

忘记所有关于“引用”的低级别废话(,这些不存在于JavaScript中),并考虑下面列出的简单规则。术语“对象”用于表示特定的值,其不一定是“对象”;这并没有改变规则,而是强化了一致性。

1)一个对象本身。如果对象可变,并且该对象发生了突变,那么该对象已发生突变

2)赋值不是创建对象的副本/克隆/副本。这包括为函数调用中的参数“赋值”的值。 对象的值。

3)的变量(或属性)不是一个对象,而它是一个名称一个对象(一个相当的方式来表达“变量的计算结果为给定的对象”)。 A 单个对象可以有许多“名称”,但它是相同的对象

其他一切都是实现细节 - 参考文献中没有提到在所有的规范中都提到过。而应注意的是,原始值(例如numberstring不能为分配了其他属性(分配将被忽略),而包装对象NumberString是完整的对象。这与上面的规则是一致的:JavaScript中没有可变的非对象值。为了讨论JavaScript语言,可以将基元值视为对象,尽管它们是完全不可变的,并且不是对象。

快乐编码。