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

javascript中的值类型引用类型对象,javascript,Javascript,javascript对象是基于值还是基于引用?例如: obj1.list =new array(); // ------ populate list obj2.list = obj1.list obj1.list =new array(); // ------ populate list obj2.list = obj1.list obj2.push("foo"); alert(obj1.pop); // "foo" (they are both the same list) 浏览器

javascript对象是基于值还是基于引用?例如:

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

obj2.push("foo");
alert(obj1.pop);    // "foo" (they are both the same list)
浏览器是否为obj2.list创建了obj1.list的不同副本,或者obj2.list只是对obj1.list的引用?

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

{a:'a'} == {a:'a'} // false
但是:

此外:

myObject.b = 'b';

console.log(myObject2.b); // Logs: "b"

赋值仅当值是基元类型(如数字、布尔值等)时才复制该值。否则,赋值只会将引用复制到同一对象(对象、数组等)。不使用赋值创建新对象

因此,在您的示例中:

obj1.list =new array();
// ------ populate list
obj2.list = obj1.list
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) 变量(或属性)不是对象,而是对象的名称(这是说“变量的计算结果为给定对象”的一种很好的方式)。一个对象可以有许多“名称”,但它是同一个对象

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


快乐编码。

这是真的,但并没有真正解决上述问题。这种比较是错误的,因为每一个对象都是独立的对象,对象的相等性会进行比较,以确定它们在内存中是否是相同的对象-它不会查看对象的内容。@jfriend00-我不明白你在说什么。我已经清楚地解释了评估和作业都是基于参考的。我在读你的文章时只看到了前两行。我不确定你是否编辑了你的答案来添加更多内容,或者只是没有显示所有内容。您当前的答案更完整。可能与的重复