javascript对象是基于值还是基于参考?例如:
obj1.list =new array();
// ------ populate list
obj2.list = obj1.list
浏览器是否为obj2.list制作了obj1.list的不同副本,或者obj2.list只是对obj1.list的引用?
答案 0 :(得分:15)
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"
答案 1 :(得分:4)
忘掉所有关于“引用”(在JavaScript中不存在)的低级废话,并考虑下面概述的简单规则。术语“对象”用于表示特定值,该值不一定是“对象”;这并没有改变规则,而是加强了一致性。
1)对象本身。如果对象 可变,并且该对象 已发生变异,那么该对象已被突变。
2)分配不创建对象的副本/克隆/副本。这包括在函数调用中“分配”给参数的值。 对象 值。
3)变量(或属性)不是一个对象,而是一个对象的名称(一种说“变量计算给定对象的漂亮方式”)。 单个对象可以有多个“名称”,但它是同一个对象。
其他所有内容都是实现细节 - 引用在所有的规范中都没有被讨论过。同时,应该注意的是,number
和string
等原始值不能分配其他属性(忽略赋值),而包装器对象Number
而String
是完整的对象。这与上述规则一致:JavaScript中没有可变的非Object值。为了讨论JavaScript语言,可以将基元值视为对象,尽管它们是完全不可变的并且不是真正的对象。
快乐的编码。
答案 2 :(得分: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
答案 3 :(得分:2)
只有当它是基本类型(如Number,Boolean等)时,赋值才会复制该值。否则,赋值只复制对同一对象(对象,数组等)的引用。不会使用赋值创建新对象。
所以,在你的例子中:
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
将指向同一个对象(包含对同一对象的引用)