javascript - 同一个对象的引用怎么不能相等?
问题描述
例如。:
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
那么这两个引用不指向同一个对象吗?
解决方案
因为你不是同一个对象的引用!它们是(表面上)看起来相同的两个对象。
想想任何类型的商店,你从货架上拿一个产品,后面有十几个相同的产品。仅仅因为它们看起来相同并不能使它们成为相同的项目。
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
。
你和你的兄弟姐妹可以有同一个父亲,如果他失去了一只手臂,那不仅适用于你们中的一个。但这并不能使您和您的兄弟姐妹成为同一个人。
推荐阅读
- php - PHP filemtime vs MySQL CMS 中图像缓存的最后更新时间戳
- spring - Jacoco 是否包含 SpringJUnitClassRunner 测试覆盖率?
- ember.js - Ember:断言失败:EmberObject.create 不再支持定义计算属性
- java - 如何使用递归在链表中成对交换节点?
- lsf - 如何使用 LSF 删除大量目录
- segue - 无法连接@IBSegueAction
- ios - 如何显示音频路由操作表?
- javascript - 仅当我单击“提交”按钮两次时才会显示表单结果
- javascript - 链接元素中的 HTML onload 事件不起作用
- vuejs2 - 如何使用带有 Laravel 后端的全栈 Vue 前端登录/注销