JavaScript对象基于值还是基于引用?例如:javascript中的值类型引用类型对象
obj1.list =new array();
// ------ populate list
obj2.list = obj1.list
是否浏览器进行obj1.list的不同副本obj2.list,或者是obj2.list只是obj1.list参考?
JavaScript对象基于值还是基于引用?例如:javascript中的值类型引用类型对象
obj1.list =new array();
// ------ populate list
obj2.list = obj1.list
是否浏览器进行obj1.list的不同副本obj2.list,或者是obj2.list只是obj1.list参考?
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"
分配使得警察只有当它是一个原始类型(如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.list
和obj2.list
将指向同一个对象(包含同一对象的引用)
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
忘记所有关于“引用”的低级别废话(,这些不存在于JavaScript中),并考虑下面列出的简单规则。术语“对象”用于表示特定的值,其不一定是“对象”;这并没有改变规则,而是强化了一致性。
1)一个对象本身。如果对象是可变,并且该对象是发生了突变,那么该对象已发生突变。
2)赋值不是创建对象的副本/克隆/副本。这包括为函数调用中的参数“赋值”的值。 对象是的值。
3)的变量(或属性)不是一个对象,而它是一个名称一个对象(一个相当的方式来表达“变量的计算结果为给定的对象”)。 A 单个对象可以有许多“名称”,但它是相同的对象。
其他一切都是实现细节 - 参考文献中没有提到在所有的规范中都提到过。而应注意的是,原始值(例如number
和string
不能为分配了其他属性(分配将被忽略),而包装对象Number
和String
是完整的对象。这与上面的规则是一致的:JavaScript中没有可变的非对象值。为了讨论JavaScript语言,可以将基元值视为对象,尽管它们是完全不可变的,并且不是对象。
快乐编码。
它是基于参考的。 – BoltClock
[Javascript的等号参考对象或克隆它们是否可能的重复](http://stackoverflow.com/questions/7467335/does-javascript-equal-sign-reference-objects-or-clones-them) – RobG