在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}
。在程序的任何地方,写 mainObj
或 ObjR
在语义上等同于写 {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;
现在,我可以区分a
和b
吗?不,我为什么要这样做?
你不能。对象始终保存为参考。
你可以复制一下。 mainObj
和 ObjR
包含相同的值。没法区分。
ObjD
只是对另一个对象的引用,您通过复制所有值使其相同。
你可以用==
区分这两个对象,因为它们是不同的对象,但你无法分辨对象是如何创建的或变量是如何填充的。
假设我有一个对象 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}
。在程序的任何地方,写 mainObj
或 ObjR
在语义上等同于写 {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;
现在,我可以区分a
和b
吗?不,我为什么要这样做?
你不能。对象始终保存为参考。
你可以复制一下。 mainObj
和 ObjR
包含相同的值。没法区分。
ObjD
只是对另一个对象的引用,您通过复制所有值使其相同。
你可以用==
区分这两个对象,因为它们是不同的对象,但你无法分辨对象是如何创建的或变量是如何填充的。