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

value type reference type object in javascript

本文关键字:引用类型 对象 类型 javascript      更新时间:2023-09-26

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

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

浏览器是否生成obj1的不同副本?obj2的列表。列表,或者是obj2。列表只是一个引用obj1.list?

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

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

但:

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

此外:

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

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

1)一个对象是它自己。如果一个对象可变的,并且如果该对象变异的,那么该对象已经变异

2) 赋值不会创建对象的拷贝/克隆/副本。这包括在函数调用中"分配"给形参的值。对象值。

3)变量(或属性)不是对象,而是对象的名称(表示"变量计算为给定对象"的一种漂亮的方式)。一个单个对象可以有多个"名称",但它们仍然是同一个对象

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

快乐编码。

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

赋值操作仅在值为基本类型(如Number、Boolean等)时才复制值。否则,赋值只是复制对同一对象(object, Array等)的引用。

不使用赋值创建新对象。

那么,在你的例子中:

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将指向同一个对象(包含对同一个对象的引用)