为什么两个相同的物体不相等
Why are two identical objects not equal to each other?
似乎下面的代码应该返回true,但它返回false。
var a = {};
var b = {};
console.log(a==b); //returns false
console.log(a===b); //returns false
这有什么意义?
规则(==
)和严格(===
)相等之间的唯一区别是严格相等运算符禁用类型转换。由于您已经在比较同一类型的两个变量,所以您使用的相等运算符类型无关紧要。
无论使用规则等式还是严格等式,如果比较相同的精确对象,则对象比较仅计算为true
。
也就是说,给定var a = {}, b = a, c = {};
、a == a
、a == b
,但给定a != c
。
两个不同的对象(即使它们都没有或具有相同的确切属性)永远不会进行同等的比较。如果你需要比较两个对象属性的相等性,这个问题有非常有用的答案。
这有什么意义?
因为对象引用的"相等",就==
和===
运算符而言,纯粹是基于引用是否引用相同的对象。这在抽象等式比较算法(==
使用)和严格等式比较算法中得到了明确的阐述(===
使用)。
在您的代码中,当您说a==b
或a===b
时,您不是在比较对象,而是在比较a
和b
中的引用,看看它们是否引用了同一个对象。这就是JavaScript的定义方式,也与许多(但不是所有)其他语言中的相等运算符的定义方式一致(例如Java、C#[除非运算符被重写,就像string
]和C++一样)。
JavaScript没有内置的等价性概念,即对象之间的比较,指示它们是否等价(例如,具有相同属性和相同值,如Java的Object#equals
)。你可以在自己的代码库中定义一个,但没有任何内在的东西来定义它。
use JSON.stringify(objname);
var a = {name : "name1"};
var b = {name : "name1"};
var c = JSON.stringify(a);
var d = JSON.stringify(b);
c==d;
//true
如《Javascript最终指南》中所述
对象不按值进行比较:两个对象即使具有相同的特性和值,也不相等。数组也是如此:即使它们以相同的顺序具有相同的值。
var o = {x:1}, p = {x:1}; // Two objects with the same properties
o === p // => false: distinct objects are never equal
var a = [], b = []; // Two distinct, empty arrays
a === b // => false: distinct arrays are never equal
对象有时被称为引用类型,以区别于JavaScript的基元类型。使用这个术语,对象值是引用,我们说对象是通过引用进行比较的:两个对象值是相同的,当且仅当它们引用相同的底层对象时。
var a = {}; // The variable a refers to an empty object.
var b = a; // Now b refers to the same object.
b.property = 1; // Mutate the object referred to by variable b.
a.property // => 1: the change is also visible through variable a.
a === b // => true: a and b refer to the same object, so they are equal.
如果我们想比较两个不同的对象,我们必须比较它们的属性。
以下是{} === {}
在JavaScript中返回false
的快速解释:
来自MDN Web文档-Working with objects: Comparing objects
。
在JavaScript中,对象是一种引用类型。两个不同的对象永远不会相等,即使它们具有相同的属性。只有将同一个对象引用与自身进行比较才会产生true。
// Two variables, two distinct objects with the same properties
var fruit = {name: 'apple'};
var fruitbear = {name: 'apple'};
fruit == fruitbear; // return false
fruit === fruitbear; // return false
// Two variables, a single object
var fruit = {name: 'apple'};
var fruitbear = fruit; // Assign fruit object reference to fruitbear
// Here fruit and fruitbear are pointing to same object
fruit == fruitbear; // return true
fruit === fruitbear; // return true
fruit.name = 'grape';
console.log(fruitbear); // output: { name: "grape" }, instead of { name: "apple" }
有关比较运算符的详细信息,请参见比较运算符。
这有什么意义?
想象一下这两个对象:
var a = { someVar: 5 }
var b = { another: 'hi' }
现在,如果你做了a === b
,你会直观地认为它应该是假的(这是正确的)。但你认为这是错误的,因为对象包含不同的键,还是因为它们是不同的对象?接下来想象一下从每个对象中移除密钥:
delete a.someVar
delete b.another
现在两者都是空对象,但相等性检查仍然完全相同,因为您仍在比较a
和b
是否是同一对象(而不是它们是否包含相同的键和值)。
===
,用于对象身份检查的严格相等运算符。
如果两个对象引用同一个对象,则它们是严格相等的。
这是两个不同的物体,所以它们不同。
想想两张空纸。它们的属性是相同的,但它们不是相同的东西。如果你在其中一个上面写一些东西,另一个就不会改变。
这是一个变通方法:Object.toJSON(obj1) == Object.toJSON(obj2)
通过转换为字符串,comprasion将基本上在字符串
在Javascript中,每个对象都是唯一的,因此{} == {}
或{} === {}
返回false。换句话说,Javascript通过标识而不是通过值来比较对象。
Double等于
( == )
Ex:'1' == 1
返回true,因为类型被排除在之外三重等于
( === )
例如:'1' === 1
严格返回false比较,检查类型甚至
- 在JavaScript中相等两个对象.在更改一时,秒会自动更改
- 为什么这两个函数调用不相等
- 一次改变一个盒子的颜色,而不是两个
- 输入字段中不超过两个单词
- 在javascript中生成两个DOM元素(而不是两个字符串)的差异
- 不超过两个重复字母/数字的正则表达式
- 我正在做一个练习,目标是打印出“史蒂夫”.和“;bill"从代码学院,它只打印一个名字,而不是两个
- onchange =“this.form.submit()“;而不是两个提交按钮
- “getElementByID().innerHTML + .src"在一个方法中声明而不是两个不同的方法
- 为什么apply()在这里只接受一个参数而不是两个
- Onclick锚链接使用ajax只传递一个变量,而不是两个变量
- 不计算两个日期之间的假期或周末
- Document.ready()只运行一个函数而不是两个
- 谷歌分析:在多跟踪设置中不接收两个数据流
- 在不添加两个连续值的情况下,从数组中获取最大和
- 如何将随机数添加到结果处的存储变量中,作为一个数字,而不是两个字符串加在一起
- 使用一个按钮而不是两个按钮来更改字符串
- Javascript看不出两个textarea id之间的区别
- 一页里有两个表格.如何设置jQuery脚本不影响两个表单按钮
- 使用一个按钮来启动和停止一个功能,而不是两个按钮