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

在Javascript中,如何区分与实际数据一起保存的对象和作为引用保存的对象?,javascript,oop,object,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]]; } mainObj={x:1}; ObjR=mainObj;

假设我有一个对象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]];
}
mainObj={x:1};
ObjR=mainObj;
ObjD={};
mainAbjArray=Object.keys(mainObj);

因为(i=0;i
ObjR
并不完全是一个对象,它是一个名称,其值是一个对象。该值恰好与名称
mainObj
的值相同。所讨论的值是
{x:1}
。在程序中的任何地方,写入
mainObj
ObjR
在语义上与写入
{x:1}是相同的
。前者是名称;后者是文字对象。无法区分两者;事实上,这个问题有些毫无意义

并非某些对象“以实际数据保存”,而另一些对象“以引用方式保存”。对象本身就是一个对象,即包含该对象的实际数据。名称不是对象,而是一种指向实际对象的指针。名称从不指向其他名称,而是指向值

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

在正常对话中,我们确实会说“object
ObjR
”之类的话,这可能会引起混淆。您需要记住,这是一种表示“名为
ObjR
的变量所引用的对象”的缩写

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

a = 1;
b = a;

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

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

并非某些对象“以实际数据保存”,而另一些对象“以引用方式保存”。对象本身就是一个对象,即包含该对象的实际数据。名称不是对象,而是一种指向实际对象的指针。名称从不指向其他名称,而是指向值

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

在正常对话中,我们确实会说“object
ObjR
”之类的话,这可能会引起混淆。您需要记住,这是一种表示“名为
ObjR
的变量所引用的对象”的缩写

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

a = 1;
b = a;

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

你不能。对象总是保存为引用

您可以复制它们。
mainObj
ObjR
包含相同的值。无法区分它们

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


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

您不能。对象始终保存为引用

您可以复制它们。
mainObj
ObjR
包含相同的值。无法区分它们

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


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

我问这个问题的原因是,作为访谈的一部分,我被要求向函数传递一个参数,而该参数是一个包含许多对象的数组。O对于这些对象,很少有像上面示例中的“ObjR”和其他类似“ObjD”的对象被创建。因此,函数应该删除像“ObjR”这样创建的所有对象,并只返回像“ObjD”这样的对象。有什么方法可以做到这一点吗?没有。这可能是一个诡计问题,或者语言不是JavaScript,或者是您面试的公司g with深感困惑。我问这个问题的原因是,作为访谈的一部分,我被要求将一个参数传递给一个函数,该参数是一个包含许多对象的数组。在这些对象中,很少有像上面示例中的“ObjR”和其他像“ObjD”这样的对象被创建。因此,函数应该删除像“ObjR”和“ObjD”这样创建的所有对象只返回像“ObjD”这样的对象。有什么方法可以做到这一点吗?不,没有。要么这是一个骗人的问题,要么语言不是JavaScript,要么你面试的公司非常困惑。