==不是值的比较吗?
为什么会{ a: 111 } == { a: 111 } // false
比较值,又不是比较内存地址,为什么false呢
概念上就理解错了。没有「== 就是值比较」这种概念。
下面是 MDN 相等运算符的概念:
比较操作符会为两个不同类型的操作数转换类型,然后进行严格比较。当两个操作数都是对象时,JavaScript会比较其内部引用,当且仅当他们的引用指向内存中的相同对象(区域)时才相等,即他们在栈内存中的引用地址相同。
每一个{}就是新创建了一个对象,这个语句解析的时候是先创建对象再进行==比较,如果两边类型相同,当都为为对象,进行的是地址值的比较;如果两边类型不同,且为对象时候,类型会[[toPrimitive]]转化,对象会找到ValueOf/toString比较,具体可参考小黄书。本题两边都为对象,且引用地址不同,故不相等。
10 回答11.7k 阅读
2 回答3.2k 阅读✓ 已解决
2 回答4.2k 阅读✓ 已解决
4 回答4.6k 阅读✓ 已解决
3 回答1.6k 阅读✓ 已解决
3 回答2.7k 阅读✓ 已解决
4 回答2.1k 阅读✓ 已解决
对象是引用类型,==本就是比较引用地址,而不是比较内部的值,所以得到的一定是false,因为引用地址不同。
如果你想比较两个对象所有属性是否完全一样,请使用lodash的isEqual方法