Dart 支持 == 和 === 运算符吗?等于和相同有什么区别?
Dart支持==
用于判断相等,identical(a, b)
用于判断身份。 Dart不再支持===
语法。
使用==
来检查两个对象是否“相等”。您可以在类中实现==
方法来定义相等的含义。例如:
class Person {
String ssn;
String name;
Person(this.ssn, this.name);
// Define that two persons are equal if their SSNs are equal
bool operator ==(other) {
return (other is Person && other.ssn == ssn);
}
}
main() {
var bob = Person('111', 'Bob');
var robert = Person('111', 'Robert');
print(bob == robert); // true
print(identical(bob, robert)); // false, because these are two different instances
}
请注意a == b
的语义:
a
或b
有一个为null
,则返回identical(a, b)
a.==(b)
使用identical(a, b)
检查两个变量是否引用同一实例。函数identical是在dart:core
中找到的顶层函数。
需要注意的是,在dart中使用identical
函数有一些注意事项,如此github问题评论中所述:
规范已更新以将double之间的相同性处理为:
identical()
函数是预定义的dart函数,如果它的两个参数是:
- 相同的对象。
- 类型为int且具有相同的数值。
- 类型为double,不是NaN,并且具有相同的数值。
这意味着,即使在dart中所有东西都是一个对象,f
和g
是不同的对象,但以下代码会打印出true
。
int f = 99;
int g = 99;
print(identical(f, g));
因为int类型是通过值来进行比较的,而不是通过引用。
所以回答你的问题,==
用于判断两个对象是否具有相同的值,而identical
用于测试引用相等性,除了像上面引述的double
和int
的情况外。
需要注意的是,在Dart中,identical
的工作方式类似于Javascript,其中 (5.0 == 5)
是 true
,但是 identical(5.0, 5)
是 false
。
identical(5.0, 5)
的结果是true
。 - CopsOnRoadidentical(5.0, 5)
是true
(因为底层的JavaScript对象是相同的)。在Dart VM中,identical(5.0, 5)
是false
。 - jamesdlin