javascript中的值类型引用类型对象

时间:2011-09-20 05:45:11

标签: javascript

javascript对象是基于值还是基于参考?例如:

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

浏览器是否为obj2.list制作了obj1.list的不同副本,或者obj2.list只是对obj1.list的引用?

4 个答案:

答案 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)变量(或属性)不是一个对象,而是一个对象的名称(一种说“变量计算给定对象的漂亮方式”)。 单个对象可以有多个“名称”,但它是同一个对象

其他所有内容都是实现细节 - 引用在所有的规范中都没有被讨论过。同时,应该注意的是,numberstring 等原始值不能分配其他属性(忽略赋值),而包装器对象NumberString是完整的对象。这与上述规则一致: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.listobj2.list将指向同一个对象(包含对同一对象的引用)