Javascript 更改嵌套对象的引用是否正在更改对根对象的引用?

Javascript 更改嵌套对象的引用是否正在更改对根对象的引用?,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,因为比较对象的引用相同,但子对象的引用

我不完全确定如何测试它-请给出建议

假设我们有对象X

{
    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,因为您正在比较两个不同的对象,而不是对同一对象的两个引用。