在Javascript中,如何区分保存为实际数据的对象和保存为引用的对象?

In Javascript, how to differntiate objects which are saved with actual data and objects saved as reference?

假设我有一个对象 mainObj,我复制了这个对象并保存在另外两个变量 ObjD 和 ObjR 中。

mainObj = {x:1};

ObjR = mainObj;

ObjD = {};

mainAbjArray = Object.keys(mainObj);

for(i=0;i<mainAbjArray.length;i++){
ObjD[mainAbjArray[i]] = mainObj[mainAbjArray[i]];
}

在上面执行之后,我有两个对象在访问时提供了正常的数据,但存储方式不同。那么,如何确定一个对象是否保存为引用(如 ObjR)并与实际数据一起保存(如 ObjD)?

ObjR不完全是一个对象,它是一个名字,它的值是一个对象。该值恰好与名称 mainObj 的值相同。有问题的值是 {x: 1}。在程序的任何地方,写 mainObjObjR 在语义上等同于写 {x: 1}。前者是名字;后者是一个文字对象。无法区分两者;其实这个问题有点无意义。

不是有的对象是"saved with actual data",有的是"saved as reference"。对象本身只是一个对象,实际数据构成了对象。名称不是对象,而是可以被认为是一种指向实际对象的指针。名称从不指向其他名称;他们指向价值观。

ObjR = mainObj; 并不代表 "set ObjR to refer to mainObj"。意思是"set the value of ObjR to the current value of mainObj"。 ObjR 与变量 mainObj 没有任何关系。

可能会引起混淆,因为在正常对话中我们确实会说 "the object ObjR" 之类的话。你需要记住,这是一种 shorthand 表示 "the object to which the variable named ObjR refers."

考虑一个更简单的数字示例:

a = 1;
b = a;

现在,我可以区分ab吗?不,我为什么要这样做?

你不能。对象始终保存为参考。

你可以复制一下。 mainObjObjR 包含相同的值。没法区分。

ObjD 只是对另一个对象的引用,您通过复制所有值使其相同。

你可以用==区分这两个对象,因为它们是不同的对象,但你无法分辨对象是如何创建的或变量是如何填充的。