我最近在制作一个应用程序时遇到了一些小问题,事实证明,我意识到让我做的事情无法正常工作的原因之一是,在某个时刻,当迭代一个JSON,并将每个值与另一个具有相同属性但值不同的JSON进行比较,我意识到我在循环中进行的比较之一是一个空数组与另一个空数组(如果该内容不存在在该数组中,或者如果它刚刚被初始化为一个数组),如下所示:
let myJson = {
title: "cualquier titulo",
content: "cualquier contenido",
links: []
}
let myJson2 = {
title: "cualquier titulo 2",
content: "cualquier contenido 2",
links: []
}
显然,在比较 json1 与 json 2 的链接时,将其转换为我会如何看待它或比较 if 时,我有类似的东西:
if([] == []){
//Instrucciones que no se ejecutaran
}
但是,我想知道为什么返回false??,即两者都是数组,都具有相同的长度并且都没有任何值,为什么它返回false呢?
Javascript,如 Java 或 C#,认为没有两个对象是相等的,因为你真正比较的是指向对象的指针。因此,
==
或者===
它们仅用于比较原语或了解对象是否完全相同:要记住的一个重要细节:在 Javascript 中有原始类型
string
(例如,Java 中不存在),还有 String 类:他在这里解释得很清楚。
基本上,它说的是一个空数组只严格等于它自己。也就是说,对空数组的引用的评估仅严格等于指向同一个空数组的同一个引用。
在您的情况下,您有两个具有两个不同引用(一个指向每个引用)的空数组,并且由于每个引用彼此不同,因此它们之间的比较是
false
.为了更好地阐明它,如果你看下图,你会看到 variable1(对对象的引用)与 variable2(对具有相同值但在内存中不同的对象的引用)有何不同。
但是,如果这两个变量指向同一个内存区域,那么它们将是相同的。
理解这一点的一个简单示例如下:
任何对象都会发生同样的事情,不仅是数组,虽然它对你来说可能看起来一样,但对于 javascript 却不是。
不幸的是,没有办法重新实现比较运算符,因此您必须创建一个特定的函数来手动比较它们。