Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么两个相同的物体不相等?_Javascript - Fatal编程技术网

Javascript 为什么两个相同的物体不相等?

Javascript 为什么两个相同的物体不相等?,javascript,Javascript,下面的代码似乎应该返回true,但它返回false var a = {}; var b = {}; console.log(a==b); //returns false console.log(a===b); //returns false 这有什么意义呢?=,对象的操作符检查身份 如果两个对象引用同一个对象,则它们严格相等 这是两个不同的对象,所以它们不同 想想两张空白的纸。它们的属性是相同的,但它们不是相同的东西。如果你在其中一个上面写些东西,另一个就不会改变。这是一个解决方法:Obje

下面的代码似乎应该返回true,但它返回false

var a = {};
var b = {};

console.log(a==b); //returns false
console.log(a===b); //returns false
这有什么意义呢?

=
,对象的操作符检查身份

如果两个对象引用同一个对象,则它们严格相等

这是两个不同的对象,所以它们不同


想想两张空白的纸。它们的属性是相同的,但它们不是相同的东西。如果你在其中一个上面写些东西,另一个就不会改变。

这是一个解决方法:
Object.toJSON(obj1)==Object.toJSON(obj2)


通过转换为字符串,压缩基本上将在字符串中进行。常规(
=
)和严格(
==
)相等之间的唯一区别是严格相等运算符禁用类型转换。因为您已经在比较同一类型的两个变量,所以使用的相等运算符的类型并不重要

无论您使用的是常规相等还是严格相等,如果您比较相同的精确对象,则对象比较仅计算为
true

也就是说,给定
vara={},b=a,c={}
a==a
a==b
,但是
a!=c

两个不同的对象(即使它们都具有零或相同的精确属性)永远不会进行相等的比较。如果需要比较两个对象属性的相等性

这有什么意义

因为就
=
==
运算符而言,对象引用的“相等性”纯粹取决于引用是否引用相同的对象。这在(由
==
使用)和(由
===
使用)中有明确的说明

在代码中,当您说
a==b
a==b
时,您不是在比较对象,而是在比较
a
b
中的引用,以查看它们是否引用同一对象。这就是JavaScript的定义,并与定义了许多语言(但不是全部)中的相等操作符(java、c ^ [除非操作符被重写,as)和C++一样]。


JavaScript没有内置的等价概念,即对象之间的比较,表明它们是否等价(例如,具有相同属性和相同值,如Java的
Object#equals
)。您可以在自己的代码库中定义一个,但是没有任何内在的东西来定义它。

就像Javascript的最终指南一样。

对象不按值进行比较:两个对象不相等,即使它们具有相同的特性和值。数组也是如此:即使它们具有相同顺序的相同值

var o={x:1},p={x:1};//具有相同特性的两个对象
o===p/=>false:不同的对象永远不相等
变量a=[],b=[];//两个不同的空数组
a===b/=>false:不同的数组永远不相等
这有什么意义

想象一下这两个物体:

var a = { someVar: 5 }
var b = { another: 'hi' }
现在如果你做了
a===b
,你会直觉地认为它应该是错误的(这是正确的)。但是您认为这是错误的,是因为对象包含不同的键,还是因为它们是不同的对象?接下来想象一下从每个对象中移除关键帧:

delete a.someVar
delete b.another
这两个对象现在都是空对象,但相等性检查仍然完全相同,因为您仍在比较
a
b
是否是同一个对象(而不是它们是否包含相同的键和值)。

下面简要解释一下为什么
{}=={}
在JavaScript中返回
false

来自MDN Web文档-

在JavaScript中,对象是引用类型。两个不同的对象永远不相等,即使它们具有相同的属性。只有将同一对象引用与自身进行比较,才能得到true

//两个变量,两个具有相同属性的不同对象
var fruit={name:'apple'};
var fruitbear={name:'apple'};
水果==水果熊;//返回错误
水果===水果熊;//返回错误
有关比较运算符的详细信息,请参见


如果仍要检查相等性,请对对象使用.equals()方法常规相等运算符的工作方式相同。唯一的区别是是否允许类型转换,这在本例中无关紧要。@josh3736:是的。而且你几乎不应该使用
=
。问题是关于效果的原因,对观察到的结果的解释,而不是比较两个对象的“解决方案”。考虑到对象中属性的顺序无法保证,这(总是)不起作用。你可能会得到
{a:1,b:2}={b:2,a:1}
即使它们是一样的。此外,具有循环引用的对象不会转换为JSON。其次,JavaScript中没有定义
Object.toJSON
。第三,假设您指的是ES5中的
JSON.stringify
,您不能依赖它为具有相同属性和相同值的两个对象返回完全相同的字符串,因为规范中没有任何地方要求属性(无序)以相同的顺序列出。引擎可以自由地做它想做的事情,这可能取决于对象的构造方式,即使它们最终具有相同的属性和相同的值。没错,我从未想过这一点,因为我总是用相同的参数顺序来表示对象。是的,Kissaki,非常正确,我只是想举一个例子来解决它。@AnzeJarni:“…我总是用相同的参数顺序来表达对象…”假设你指的是属性,同样,对象属性没有顺序。尽管已授予,但如果您创建一个对象并添加
a
b
c
属性t
delete a.someVar
delete b.another
// 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" }
In Javascript each object is unique hence `{} == {}` or `{} === {}` returns false. In other words Javascript compares objects by identity, not by value.

 1. Double equal to `( == )` Ex: `'1' == 1` returns true because type is excluded 
     
 2. Triple equal to `( === )` Ex: `'1' === 1` returns false compares strictly, checks for type even