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

Ars*_*son 7 javascript

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

obj1.list =new array();
// ------ populate list
obj2.list = obj1.list
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*ber 16

JavaScript对象(以及扩展名:数组,正则表达式,日期,非原始字符串/数字/布尔等)的相等和赋值是基于引用的:

{a:'a'} == {a:'a'} // false
Run Code Online (Sandbox Code Playgroud)

但:

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

myObject == myObject2 // true
Run Code Online (Sandbox Code Playgroud)

此外:

myObject.b = 'b';

console.log(myObject2.b); // Logs: "b"
Run Code Online (Sandbox Code Playgroud)


小智 5

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

1) 一个对象就是它自己。如果对象可变的,如果该对象突变,然后该对象已突变

2)赋值不会创建对象的副本/克隆/复制。这包括“分配”给函数调用中的参数的值。对象就是价值。

3)变量(或属性)不是一个对象,而是一个对象的名称(一种漂亮的说法“变量计算为给定对象”)。一个单独的对象可以有很多“名字”,但它是同一个对象

其他一切都是一个实现细节——在规范中根本没有提到引用。同时,应该注意的是,原始值如numberstring 不能分配额外的属性(分配被忽略),而包装对象NumberString是成熟的对象。这与上面的规则是一致的:JavaScript 中没有可变的非 Object 值。为了讨论 JavaScript 语言,可以将原始值视为对象,尽管它们是完全不可变的并且不是真正的对象。

快乐编码。