猿问

同一个对象的引用如何不能相等?

例如。:


let userOne = {

  name: "Test",

  surname: "Test"

}


let userTwo = {

  ...userOne

}

console.log(userOne === userTwo); // false

但是,例如:


console.log(userOne.name === userTwo.name); // true

所以 userOne 和 userTwo 是同一对象的两个引用,但console.log(userOne === userTwo);返回 fasle。


为什么?


修改: 好的。在前面的例子中有两个对象。但是这个呢:


let userOne = {

  name: "Test",

  surname: "Test surname",

  sizes: {

    width: 200,

    height: 200,

  }

}


let userTwo = {

  ...userOne

}

userTwo.sizes.width = 50;


alert(userOne.sizes.width); // 50

所以 userOne 和 userTwo 是同一个对象的引用。


但:alert(userOne == userTwo);// false


那么这两个引用不指向同一个对象?


catspeake
浏览 159回答 4
4回答

潇湘沐

因为你不是同一个对象的引用!它们是(表面上)看起来相同的两个对象。想想任何一家商店,你从货架上拿了一件商品,它后面有十几种相同的商品。仅仅因为它们看起来相同并不能使它们成为相同的项目。let userTwo = userOne;创建对同一项目的第二个引用。let userTwo = {...userOne}创建一个新对象并将拥有的和可枚举的属性复制到该新对象。在前面的例子中有两个对象。但是这个呢:let userOne = { name: "Test", surname: "Test surname", sizes: {   width: 200,   height: 200, }}let userTwo = { ...userOne}userTwo.sizes.width = 50;alert(userOne.sizes.width); // 50在这里userOne.size === userTwo.size。所以如果你改变一个......另一个是相同的。但是userOne !== userTwo。你和你的兄弟姐妹可以有同一个父亲,如果他失去了一只手臂,那么这不仅适用于你们中的一个。但这并不能使您和您的兄弟姐妹成为同一个人。

芜湖不芜

它们不是同一个对象。您有两个不同的对象,但第二个对象具有第一个对象的属性,并使用spread syntax复制到其中。如果第二个对象中包含更多属性,则演示起来会更清楚。let userOne = {  name: "Test",  surname: "Test"}let userTwo = { ...userOne,  yearOfBirth: 2000};console.log({  userOne});console.log({  userTwo});如您所见,附加值被添加到第二个对象而不是第一个对象。

蝴蝶刀刀

es6 传播运算符{...userOne},创建对象的副本userOne并将其存储在不同的内存位置,这也等于此,let userTwo = Object.assign({}, userOne);但是如果你将对象分配给另一个,let userThree = userOne; 这将返回 true。另一方面,这只比较值userOne.name === userTwo.name所以它返回 true。

肥皂起泡泡

由于您在 equals() 方法中给出的逻辑,默认情况下它们是相等的。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答