Javascript 更改嵌套对象的引用是否正在更改对根对象的引用?
我不完全确定如何测试它-请给出建议 假设我们有对象XJavascript 更改嵌套对象的引用是否正在更改对根对象的引用?,javascript,angular,reactjs,typescript,redux,Javascript,Angular,Reactjs,Typescript,Redux,我不完全确定如何测试它-请给出建议 假设我们有对象X { a: { b: { c: true } } } 然后我们对它进行变异,这样我们就有了对象Y { a: { b: { ...X.a.b.c, c: false } } } 问题如果我们比较X==Y(使用严格相等),它将返回true,因为比较对象的引用相同,但子对象的引用
{
a: {
b: {
c: true
}
}
}
然后我们对它进行变异,这样我们就有了对象Y
{
a: {
b: {
...X.a.b.c,
c: false
}
}
}
问题如果我们比较X==Y(使用严格相等),它将返回true,因为比较对象的引用相同,但子对象的引用不同?要比较两个嵌套对象,我们应该进行深入比较。==将仅检查对象的引用是否相等。为了进行深入比较,我们可以使用loadash的isEqual函数代码>如果它们相等,则返回true
或者,您可以对两个对象进行字符串化,并对它们进行比较。
JSON.stringify(X)==JSON.stringify(Y)
要比较两个嵌套对象,我们应该进行深入比较。==将仅检查对象的引用是否相等。为了进行深入比较,我们可以使用loadash的isEqual函数代码>如果它们相等,则返回true
或者您可以将这两个对象字符串化,并将它们进行比较。
JSON.stringify(X)==JSON.stringify(Y)
在使用扩展运算符(…X.a.b.c)的代码部分存在错误
X.a.b.c持有原始值。所以,如果我们尝试在原语上使用扩展运算符,它不会产生任何结果
比如说,
let a = {
x: 2
};
let b = {
...a.x
};
let c = {
x: 2
}
let e = a;
console.log(b); // Logs {} to the console
console.log(a===c); // Logs false to the console
console.log(a==c); // Logs false to the console
console.log(a==e); // Logs true to the console
在比较部分,如果我们比较两个引用
两个不同的对象将返回false
,但是如果我们比较
两个变量引用同一个对象,那么它将
返回true
有关比较对象和原语的不同方法的更多信息,请参阅下面有关对象.is
函数的MDN文档
使用扩展运算符(…X.a.b.c)的代码部分有错误 X.a.b.c持有原始值。所以,如果我们尝试在原语上使用扩展运算符,它不会产生任何结果 比如说,
let a = {
x: 2
};
let b = {
...a.x
};
let c = {
x: 2
}
let e = a;
console.log(b); // Logs {} to the console
console.log(a===c); // Logs false to the console
console.log(a==c); // Logs false to the console
console.log(a==e); // Logs true to the console
在比较部分,如果我们比较两个引用
两个不同的对象将返回false
,但是如果我们比较
两个变量引用同一个对象,那么它将
返回true
有关比较对象和原语的不同方法的更多信息,请参阅下面有关对象.is
函数的MDN文档
在这种情况下,使用
==
或===
没有任何区别。您需要发布实际代码。如果您有X={a:{b:{c:true}}}
和Y={a:{b:{…X.a.b.c,c:false}}}
那么X===Y
和X==Y
将为false,因为您正在比较两个不同的对象,而不是对同一对象的两个引用。在这种情况下使用==
或=
没有区别。您需要发布实际代码。如果您有X={a:{b:{c:true}}}
和Y={a:{b:{…X.a.b.c,c:false}}}
那么X===Y
和X==Y
将为false,因为您正在比较两个不同的对象,而不是对同一对象的两个引用。