如何确定两个 JavaScript 对象相等?
严格相等运算符会告诉您两个对象类型是否相等。但是,有没有一种方法可以判断两个对象是否相等,很像 Java 中的哈希码值?
Stack Overflow 问题JavaScript 中是否有任何类型的 hashCode 函数? 与此问题类似,但需要更学术的答案。上面的场景演示了为什么有必要拥有一个,我想知道是否有任何等效的解决方案。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(30)
为什么要重新发明轮子?尝试一下Lodash。它有许多必备函数,例如 isEqual()。
它将强力检查每个键值 - 就像本页上的其他示例一样 - 使用 ECMAScript 5< /a> 和本机优化(如果它们在浏览器中可用)。
注意:以前这个答案推荐 Underscore.js,但是 lodash 在修复错误和一致解决问题方面做得更好。
Why reinvent the wheel? Give Lodash a try. It has a number of must-have functions such as isEqual().
It will brute force check each key value - just like the other examples on this page - using ECMAScript 5 and native optimizations if they're available in the browser.
Note: Previously this answer recommended Underscore.js, but lodash has done a better job of getting bugs fixed and addressing issues with consistency.
简短答案
简单的答案是:不,没有通用的方法可以确定一个对象与另一个对象在您的意思上相等。例外情况是当您严格认为对象是无类型的时。
长答案
这个概念是 Equals 方法的概念,它比较对象的两个不同实例以指示它们在值级别是否相等。但是,如何实现
Equals
方法取决于具体类型。对具有原始值的属性进行迭代比较可能还不够:对象可能包含与相等性无关的属性。例如,在上面的例子中,
c
对于确定 MyClass 的任意两个实例是否相等并不重要,只有a
和b
才是重要的。重要的。在某些情况下,c
可能因实例而异,但在比较过程中并不显着。请注意,当成员本身也可能是类型的实例并且每个成员都需要具有确定相等性的方法时,就会出现此问题。
更复杂的是,在 JavaScript 中数据和方法之间的区别是模糊的。
对象可以引用将作为事件处理程序调用的方法,并且这可能不会被视为其“值状态”的一部分。而另一个对象很可能被分配一个执行重要计算的函数,从而使该实例与其他实例不同,仅仅是因为它引用了不同的函数。
如果一个对象的现有原型方法之一被另一个函数覆盖了怎么办?它仍然可以被认为等于另一个在其他方面相同的实例吗?这个问题只能根据每种类型的具体情况来回答。
如前所述,异常将是严格无类型的对象。在这种情况下,唯一明智的选择是对每个成员进行迭代和递归比较。即使如此,人们还是要问函数的“价值”是什么?
The short answer
The simple answer is: No, there is no generic means to determine that an object is equal to another in the sense you mean. The exception is when you are strictly thinking of an object being typeless.
The long answer
The concept is that of an Equals method that compares two different instances of an object to indicate whether they are equal at a value level. However, it is up to the specific type to define how an
Equals
method should be implemented. An iterative comparison of attributes that have primitive values may not be enough: an object may contain attributes which are not relevant to equality. For example,In this above case,
c
is not really important to determine whether any two instances of MyClass are equal, onlya
andb
are important. In some casesc
might vary between instances and yet not be significant during comparison.Note this issue applies when members may themselves also be instances of a type and these each would all be required to have a means of determining equality.
Further complicating things is that in JavaScript the distinction between data and method is blurred.
An object may reference a method that is to be called as an event handler, and this would likely not be considered part of its 'value state'. Whereas another object may well be assigned a function that performs an important calculation and thereby makes this instance different from others simply because it references a different function.
What about an object that has one of its existing prototype methods overridden by another function? Could it still be considered equal to another instance that it otherwise identical? That question can only be answered in each specific case for each type.
As stated earlier, the exception would be a strictly typeless object. In which case the only sensible choice is an iterative and recursive comparison of each member. Even then one has to ask what is the 'value' of a function?
当对象引用内存中的同一位置时,JavaScript 中对象的默认相等运算符将产生 true。
如果您需要不同的相等运算符,则需要向您的类添加一个
equals(other)
方法或类似的方法,并且问题域的具体情况将决定其确切含义。这是一个扑克牌示例:
The default equality operator in JavaScript for Objects yields true when they refer to the same location in memory.
If you require a different equality operator you'll need to add an
equals(other)
method, or something like it to your classes and the specifics of your problem domain will determine what exactly that means.Here's a playing card example:
简短的函数
deepEqual
实现:编辑:版本 2,使用 jib 的建议和 ES6 箭头函数:
Short functional
deepEqual
implementation:Edit: version 2, using jib's suggestion and ES6 arrow functions:
这是我的版本。它使用新的 Object.keys 功能ES5 中引入了来自 + 的想法/测试,+ 和 +:
This is my version. It is using new Object.keys feature that is introduced in ES5 and ideas/tests from +, + and +:
如果您使用 AngularJS,
angular.equals
函数将确定两个对象是否相等平等的。在 Ember.js 中使用isEqual
。angular.equals
- 请参阅 文档 或 来源了解有关此方法的更多信息。它也对数组进行深度比较。isEqual
- 请参阅 文档 或 来源了解更多信息方法。它不对数组进行深度比较。If you are working in AngularJS, the
angular.equals
function will determine if two objects are equal. In Ember.js useisEqual
.angular.equals
- See the docs or source for more on this method. It does a deep compare on arrays too.isEqual
- See the docs or source for more on this method. It does not do a deep compare on arrays.如果您使用的是 JSON 库,则可以将每个对象编码为 JSON,然后比较结果字符串是否相等。
注意:虽然这个答案在很多情况下都有效,但正如一些人在评论中指出的那样,它由于多种原因而存在问题。几乎在所有情况下,您都希望找到更强大的解决方案。
If you are using a JSON library, you can encode each object as JSON, then compare the resulting strings for equality.
NOTE: While this answer will work in many cases, as several people have pointed out in the comments it's problematic for a variety of reasons. In pretty much all cases you'll want to find a more robust solution.
对于那些使用 Node 的人来说,原生
util
库上有一个名为isDeepStrictEqual
的便捷方法可以实现此目的。https://nodejs.org/api/util.html#util_util_isdeepstrictequal_val1_val2
For those of you using Node, there is a convenient method called
isDeepStrictEqual
on the nativeutil
library that can achieve this.https://nodejs.org/api/util.html#util_util_isdeepstrictequal_val1_val2
在 Node.js 中,您可以使用其原生
require("assert").deepStrictEqual
。更多信息:http://nodejs.org/api/assert.html
例如:
另一个返回 < 的示例code>true /
false
而不是返回错误:In Node.js, you can use its native
require("assert").deepStrictEqual
. More info:http://nodejs.org/api/assert.html
For example:
Another example that returns
true
/false
instead of returning errors:这个问题已经有30多个答案了。我将总结并解释它们(用“我父亲”的比喻)并添加我建议的解决方案。
你有4+1类解决方案:
1)使用一种不完整的快速单行
如果你很匆忙并且99%的正确率有效。
这方面的例子是,
JSON.stringify()
建议 Pratik Bhalodiya,或JSON.encode
作者:Joel Anair,或.toString()
或其他将对象转换为字符串,然后使用===
逐个字符比较两个字符串的方法。然而,缺点是字符串中的对象没有全球标准的唯一表示形式。例如
{ a: 5, b: 8}
和{b: 8 and a: 5 }
是相等的。我的父亲类比
当我谈论我的父亲时,“我高大帅气的父亲”和“我英俊高大的父亲”是同一个人!但这两个字符串并不相同。
请注意,英语语法中实际上存在正确(标准方式)的形容词顺序,即说它应该是一个“英俊的高个子男人”,但是如果你盲目地假设 iOS 8 Safari 的 Javascript 引擎也遵守相同的语法,那么你就是在拿自己的能力冒险! #WelcomeToJavascriptNonStandards
2) 编写自己的 DIY 递归函数
如果您正在学习,那就太好了。
示例是 atmin 的解决方案。
最大的缺点是你肯定会错过一些边缘情况。您是否考虑过对象值中的自引用?您考虑过
NaN
吗?您是否考虑过两个具有相同ownProperties
但原型父对象不同的对象?我只会鼓励人们在练习并且代码不会投入生产时这样做。这是重新发明轮子有理由的唯一情况。
我的父亲类比
这就像假设如果我父亲的名字是“约翰·史密斯”并且他的生日是“1/1/1970”,那么任何名字是“约翰·史密斯”并且出生于“1/1/1970”的人都是我的父亲。
通常情况都是如此,但是如果那天有两个“约翰·史密斯”出生怎么办?如果您认为您会考虑他们的身高,那么这会提高准确性,但仍然不是完美的比较。
2.1 有限范围的 DIY 比较器
人们可能会考虑只检查“有限”数量的属性,而不是疯狂地递归地检查所有属性。例如,如果对象是
User
,您可以比较它们的emailAddress
字段。它仍然不是一个完美的解决方案,但相对于解决方案 2 的优点是:
3) 使用
equal
函数的库版本如果您需要生产级质量,并且无法更改系统的设计,则很好。
示例为
_。 equal
lodash,已在 coolaj86的答案或Tony Harvey 的回答 或 Node 的作者:拉斐尔·泽维尔。ownProperties
但原型父代不同的对象是否应被视为相同。)最后,您可能无意中解决了潜在的设计问题;只是说!我的父亲类比
这就像花钱找一家机构根据他的电话、姓名、地址等找到我的亲生父亲。
这会花费更多,而且可能比我自己进行背景调查更准确,但是不包括边缘情况,例如我的父亲是移民/庇护且他的生日未知!
4) 在对象中使用标识符
如果您[仍然]可以更改系统的设计(您正在处理的对象)并且希望您的代码持续很长时间,那么很好。
它并不适用于所有情况,并且可能性能不是很好。然而,如果你能做到的话,这是一个非常可靠的解决方案。
解决方案是,系统中的每个
对象
都将具有一个唯一标识符以及所有其他属性。标识符的唯一性将在生成时得到保证。您将使用此 ID(也称为 UUID/GUID - 全局/通用唯一标识符)当谈到比较两个对象时。即当且仅当这些 ID 相等时它们才相等。ID 可以是简单的
auto_incremental
数字,也可以是通过库(建议)或一段代码。您需要做的就是确保它始终是唯一的,在auto_incremental
的情况下,它可以是内置的,或者在 UUID 的情况下,可以检查所有现有值(例如 MySQL 的UNIQUE
列属性)或简单地(如果来自库)依赖于提供极低的冲突可能性。请注意,您还需要始终将 ID 与对象一起存储(以保证其唯一性),并且实时计算它可能不是最好的方法。
我父亲的类比
就像知道我父亲的社会安全号码是 911-345-9283,所以任何拥有这个 SSN 的人都是我的父亲,任何自称是我父亲的人都必须拥有这个 SSN。
结论
就准确性和可靠性而言,我个人更喜欢解决方案 #4 (ID)。如果不可能的话,为了可预测性,我会选择#2.1,然后选择#3。如果两者都不可能,则#2,最后#1。
This question has more than 30 answers already. I am going to summarize and explain them (with a "my father" analogy) and add my suggested solution.
You have 4+1 classes of solutions:
1) Use a hacky incomplete quick one-liner
Good if you are in a rush and 99% correctness works.
Examples of this is,
JSON.stringify()
suggested by Pratik Bhalodiya, orJSON.encode
by Joel Anair, or.toString()
, or other methods that transform your objects into a String and then compare the two Strings using===
character by character.The drawback, however, is that there is no globally standard unique representation of an Object in String. e.g.
{ a: 5, b: 8}
and{b: 8 and a: 5 }
are equal.My Father Analogy
When I am talking about my father, "my tall handsome father" and "my handsome tall father" are the same person! But the two strings are not the same.
Note that there is actually a correct (standard way) order of adjectives in English grammar, which says it should be a "handsome tall man," but you are risking your competency if you blindly assume Javascript engine of iOS 8 Safari is also abiding the same grammar, blindly! #WelcomeToJavascriptNonStandards
2) Write your own DIY recursive function
Good if you are learning.
Examples are atmin's solution.
The biggest disadvantage is you will definitely miss some edge cases. Have you considered a self-reference in object values? Have you considered
NaN
? Have you considered two objects that have the sameownProperties
but different prototypical parents?I would only encourage people to do this if they are practicing and the code is not going to go in production. That's the only case that reinventing the wheel has justifications.
My Father Analogy
It's like assuming if my dad's name is "John Smith" and his birthday is "1/1/1970", then anyone whose name is "John Smith" and is born on "1/1/1970" is my father.
That's usually the case, but what if there are two "John Smith"s born on that day? If you think you will consider their height, then that's increasing the accuracy but still not a perfect comparison.
2.1 You limited scope DIY comparator
Rather than going on a wild chase of checking all the properties recursively, one might consider checking only "a limited" number of properties. For instance, if the objects are
User
s, you can compare theiremailAddress
field.It's still not a perfect one, but the benefits over solution #2 are:
3) Use a library version of
equal
functionGood if you need a production-level quality, and you cannot change the design of the system.
Examples are
_.equal
of lodash, already in coolaj86's answer or Angular's or Ember's as mentioned in Tony Harvey's answer or Node's by Rafael Xavier.ownProperties
but different prototypical parents should be considered the same or not.) Finally, you might be unintentionally band-aiding an underlying design problem with this; just saying!My Father Analogy
It's like paying an agency to find my biological father, based on his phone, name, address, etc.
It's gonna cost more, and it's probably more accurate than myself running the background check, but doesn't cover edge cases like when my father is immigrant/asylum and his birthday is unknown!
4) Use an IDentifier in the Object
Good if you [still] can change the design of the system (objects you are dealing with) and you want your code to last long.
It's not applicable in all cases, and might not be very performant. However, it's a very reliable solution, if you can make it.
The solution is, every
object
in the system will have a unique identifier along with all the other properties. The uniqueness of the identifier will be guaranteed at the time of generation. And you will use this ID (also known as UUID/GUID -- Globally/Universally Unique Identifier) when it comes to comparing two objects. i.e. They are equal if and only if these IDs are equal.The IDs can be simple
auto_incremental
numbers, or a string generated via a library (advised) or a piece of code. All you need to do is make sure it's always unique, which in case ofauto_incremental
it can be built-in, or in case of UUID, can be checked will all existing values (e.g. MySQL'sUNIQUE
column attribute) or simply (if coming from a library) be relied upon giving the extremely low likelihood of a collision.Note that you also need to store the ID with the object at all times (to guarantee its uniqueness), and computing it in real-time might not be the best approach.
My Father Analogy
It's like known my father's Social Security Number is 911-345-9283, so anyone who has this SSN is my father, and anyone who claims to be my father must have this SSN.
Conclusion
I personally prefer solution #4 (ID) over them all for accuracy and reliability. If it's not possible I'd go with #2.1 for predictability, and then #3. If neither is possible, #2 and finally #1.
您是否想测试两个对象是否相等?即:它们的属性相等吗?
如果是这种情况,您可能会注意到这种情况:
您可能必须这样做:
显然该函数可以进行大量优化,并且能够进行深度检查(以处理嵌套对象:< code>var a = { foo : { fu : "bar" } }) 但你明白了。
正如 FOR 指出的,您可能必须根据自己的目的进行调整,例如:不同的类可能有不同的“等于”定义。如果您只使用普通对象,上述内容可能就足够了,否则自定义
MyClass.equals()
函数可能是正确的选择。Are you trying to test if two objects are the equal? ie: their properties are equal?
If this is the case, you'll probably have noticed this situation:
you might have to do something like this:
Obviously that function could do with quite a bit of optimisation, and the ability to do deep checking (to handle nested objects:
var a = { foo : { fu : "bar" } }
) but you get the idea.As FOR pointed out, you might have to adapt this for your own purposes, eg: different classes may have different definitions of "equal". If you're just working with plain objects, the above may suffice, otherwise a custom
MyClass.equals()
function may be the way to go.如果对象 1 与对象 2 具有相同的值,结果将为 true。
Result will be true if object1 has same values on object2.
如果您有方便的深度复制功能,则可以使用以下技巧在匹配属性顺序时仍然使用
JSON.stringify
:演示:http://jsfiddle.net/CU3vb/3/
理由:
由于
obj1
的属性被复制克隆人一一按照顺序克隆中的内容将被保留。当 obj2 的属性复制到克隆时,由于 obj1 中已经存在的属性将被简单地覆盖,因此它们在克隆中的顺序将被保留。If you have a deep copy function handy, you can use the following trick to still use
JSON.stringify
while matching the order of properties:Demo: http://jsfiddle.net/CU3vb/3/
Rationale:
Since the properties of
obj1
are copied to the clone one by one, their order in the clone will be preserved. And when the properties ofobj2
are copied to the clone, since properties already existing inobj1
will simply be overwritten, their orders in the clone will be preserved.用于比较所有内容的最简单和逻辑解决方案,例如对象、数组、字符串、整数...
JSON.stringify({a: val1 }) === JSON.stringify({a: val2})
注意:
val1
和val2
替换为您的Simplest and logical solutions for comparing everything Like Object, Array, String, Int...
JSON.stringify({a: val1}) === JSON.stringify({a: val2})
Note:
val1
andval2
with your Object我使用这个
comparable
函数来生成可与 JSON 进行比较的对象的副本:在测试中派上用场(大多数测试框架都有
is
函数)。例如,如果发现差异,则会记录字符串,从而使差异易于发现:
I use this
comparable
function to produce copies of my objects that are JSON comparable:Comes in handy in tests (most test frameworks have an
is
function). E.g.If a difference is caught, strings get logged, making differences spottable:
这是 ES6/ES2015 中使用函数式方法的解决方案:
此处提供演示
Heres's a solution in ES6/ES2015 using a functional-style approach:
demo available here
我不知道是否有人发布了与此类似的内容,但这是我用来检查对象相等性的函数。
此外,它是递归的,因此它还可以检查深度相等(如果您这么称呼它)。
I don't know if anyone's posted anything similar to this, but here's a function I made to check for object equalities.
Also, it's recursive, so it can also check for deep equality, if that's what you call it.
ES6:我能完成的最少代码是这样的。它通过对表示对象的所有排序的键值数组进行字符串化来递归地进行深度比较,唯一的限制是没有方法或符号进行比较。
重要:此函数在 ARRAY 中执行 JSON.stringfy,其中键已排序,NOT 在其自身的对象中:
ES6: The minimum code I could get it done, is this. It do deep comparison recursively by stringifying all key value array sorted representing the object, the only limitation is no methods or symbols are compare.
IMPORTANT: This function is doing a JSON.stringfy in an ARRAY with the keys sorted and NOT in the object it self:
下面是一个简短的实现,它使用
JSON.stringify
但按照@Jor 此处的建议对键进行排序。一些测试取自@EbrahimByagowi 此处的答案。
当然,通过使用 JSON.stringify,解决方案仅限于 JSON 可序列化类型(字符串、数字、JSON 对象、数组、布尔值、null)。不支持
Date
、Function
等对象。Below is a short implementation which uses
JSON.stringify
but sorts the keys as @Jor suggested here.Some tests were taken from the answer of @EbrahimByagowi here.
Of course, by using
JSON.stringify
, the solution is limited to JSON-serializable types (a string, a number, a JSON object, an array, a boolean, null). Objects likeDate
,Function
, etc. are not supported.只是想利用一些 es6 功能贡献我的对象比较版本。它不考虑订单。将所有 if/else 转换为三元后,我得到以下结果:
Just wanted to contribute my version of objects comparison utilizing some es6 features. It doesn't take an order into account. After converting all if/else's to ternary I've came with following:
您可以使用 underscore.js 库中的
_.isEqual(obj1, obj2)
。这是一个示例:
请从此处查看官方文档: http://underscorejs.org/#isEqual
you can use
_.isEqual(obj1, obj2)
from the underscore.js library.Here is an example:
See the official documentation from here: http://underscorejs.org/#isEqual
我发现比较两个 javascript 对象值同时忽略属性顺序的一种简单方法是使用 JSON stringify 替换函数:
这将在每一步对属性进行排序,以便字符串结果与属性顺序保持不变。有人可能以前做过这个,但我只是想我会分享它,以防万一没有:)。
One easy way I have found to compare the values of two javascript objects while ignoring property order is with the JSON stringify replacer function:
This will order the properties at every step of the way so that the string result will be invariant to property order. Some one has probably done this before but I just thought I would share it incase not :).
编辑:这种方法有很大缺陷,并且充满了自己的问题。我不推荐它,并且希望有一些反对票!这是有问题的,因为 1) 有些东西无法比较(即函数),因为它们无法序列化,2) 这不是一种非常快的比较方法,3) 它有排序问题,4) 它可能有冲突问题/如果未正确实现,则会出现误报,5) 它无法检查“准确性”(
===
),而是基于值相等,这通常不是比较中所需的方法。许多人没有意识到这个问题的一个简单解决方案是对 JSON 字符串(每个字符)进行排序。这通常也比此处提到的其他解决方案更快:
此方法的另一个有用的事情是您可以通过将“replacer”函数传递给 JSON.stringify 函数来过滤比较(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Example_of_using_replacer_parameter)。以下仅比较名为“derp”的所有对象键:
EDIT: This method is quite flawed, and is rife with its own issues. I don't recommend it, and would appreciate some down-votes! It is problematic because 1) Some things can not be compared (i.e. functions) because they can not be serialized, 2) It isn't a very fast method of comparing, 3) It has ordering issues, 4) It can have collision issues/false positives if not properly implemented, 5) It can't check for "exactness" (
===
), and instead is based of value equality, which is oftentimes not what is desired in a comparison method.A simple solution to this issue that many people don't realize is to sort the JSON strings (per character). This is also usually faster than the other solutions mentioned here:
Another useful thing about this method is you can filter comparisons by passing a "replacer" function to the JSON.stringify functions (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Example_of_using_replacer_parameter). The following will only compare all objects keys that are named "derp":
简而言之:
For short and simple:
由于需要一个比已发布的更通用的对象比较函数,我编写了以下内容。批评表示赞赏...
Needing a more generic object comparison function than had been posted, I cooked up the following. Critique appreciated...
如果您要比较 JSON 对象,可以使用 https://github.com/mirek/node-rus- diff
用法:
如果两个对象不同,则为 MongoDB 兼容
{$rename:{...}, $unset:{...}, $set:{...}}
返回类似对象。If you are comparing JSON objects you can use https://github.com/mirek/node-rus-diff
Usage:
If two objects are different, a MongoDB compatible
{$rename:{...}, $unset:{...}, $set:{...}}
like object is returned.我遇到了同样的问题并决定编写自己的解决方案。但因为我还想将数组与对象进行比较,反之亦然,所以我设计了一个通用的解决方案。我决定将这些函数添加到原型中,但可以轻松地将它们重写为独立函数。这是代码:
该算法分为两部分; equals 函数本身和一个用于查找数组/对象中属性的数字索引的函数。之所以需要 find 函数,是因为 indexof 只查找数字和字符串,而不查找对象。
可以这样调用它:
该函数返回 true 或 false,在本例中为 true。
该算法还允许在非常复杂的对象之间进行比较:
上面的示例将返回 true,即使属性具有不同的顺序。需要注意的一个小细节:此代码还检查两个变量的类型是否相同,因此“3”与 3 不同。
I faced the same problem and deccided to write my own solution. But because I want to also compare Arrays with Objects and vice-versa, I crafted a generic solution. I decided to add the functions to the prototype, but one can easily rewrite them to standalone functions. Here is the code:
This Algorithm is split into two parts; The equals function itself and a function to find the numeric index of a property in an array / object. The find function is only needed because indexof only finds numbers and strings and no objects .
One can call it like this:
The function either returns true or false, in this case true.
The algorithm als allows comparison between very complex objects:
The upper example will return true, even tho the properties have a different ordering. One small detail to look out for: This code also checks for the same type of two variables, so "3" is not the same as 3.
假设对象中属性的顺序没有改变。
JSON .stringify() 适用于深度和非深度两种类型的对象,不太确定性能方面:
Assuming that the order of the properties in the object is not changed.
JSON.stringify() works for deep and non-deep both types of objects, not very sure of performance aspects:
如何确定部分对象(Partial)等于打字稿中的原始对象(T)。
PS 最初我打算创建一个带有答案的新问题。但这样的问题已经存在并标记为重复。
How to determine that the partial object (Partial<T>) is equal to the original object (T) in typescript.
P.S. Initially I was planning to create a new question with an answer. But such a question already exists and marked as a duplicate.
简而言之,这将检查两个变量的相等性,无论类型如何。
For short and simple, this will check equality of two variables no matter the type.