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

时间:2015-02-18 06:51:24

标签: javascript oop object

考虑我有一个对象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)?

2 个答案:

答案 0 :(得分:2)

ObjR不是一个对象,它是一个名称,其值是一个对象。该值恰好与名称mainObj的值相同。相关值为{x: 1}。在您的计划中的任何地方,写mainObjObjR在语义上与编写{x: 1}相同。前者是名字;后者是一个文字对象。没有办法区分这两者;事实上,这个问题有点无意义。

某些对象不是“用实际数据保存”而其他对象“保存为参考”。对象本身只是一个对象,包含该对象的实际数据。名称不是对象,而是可以被认为是指向实际对象的一种指针。名字从不指向其他名称;他们指向价值观。

ObjR = mainObj;并不意味着“设置ObjR来引用mainObj”。这意味着“将ObjR的值设置为mainObj的当前值”。 ObjR与变量mainObj没有任何联系。

可能会出现混乱,因为在正常的对话中我们会说“对象ObjR”之类的内容。你需要记住,这是一种说法“名为ObjR的变量引用的对象的简写。”

考虑一个带数字的简单例子:

a = 1;
b = a;

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

答案 1 :(得分:2)

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

您可以复制它们。 mainObjObjR包含相同的值。没有办法区分它们。

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

您可以区分具有==的两个对象,因为它们是不同的对象,但您无法告诉对象是如何创建的,或者是如何填充变量。