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)变量(或属性)不是一个对象,而是一个对象的名称(一种漂亮的说法“变量计算为给定对象”)。一个单独的对象可以有很多“名字”,但它是同一个对象。
其他一切都是一个实现细节——在规范中根本没有提到引用。同时,应该注意的是,原始值如number和string 不能分配额外的属性(分配被忽略),而包装对象Number和String是成熟的对象。这与上面的规则是一致的:JavaScript 中没有可变的非 Object 值。为了讨论 JavaScript 语言,可以将原始值视为对象,尽管它们是完全不可变的并且不是真正的对象。
快乐编码。