Dart 是否支持 == 和 === ?平等和身份有什么区别?
4 回答
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)
检查两个变量是否引用同一个实例。same是在 中找到的顶级函数dart:core
。
由于据说 DART 与存在 === 的 javascript 相关,我希望不要很快被否决。
身份作为一个概念意味着 1 等于 1,但 1.0 不等于 1,false 也不等于 0,“2”也不等于 2,即使每个都相互评估并且 1==1.0 返回 true。
应该注意的是,identical
在 dart 中使用该函数有一些注意事项,正如这个 github 问题评论中提到的:
规范已更新,以将双打之间的相同处理如下:
same() 函数是预定义的 dart 函数,如果它的两个参数是以下之一,则返回 true:
- 同一个对象。
- int 类型的并且具有相同的数值。
- double 类型,不是 NaN,并且具有相同的数值。
这意味着即使dart 中的所有内容f
都是一个对象,并且g
是不同的对象,以下打印true
.
int f = 99;
int g = 99;
print(identical(f, g));
因为整数的值相同,而不是引用。
因此,要回答您的问题,==
用于确定两个对象是否具有相同的值,但identical
用于测试引用相等性,但上述摘录的情况double
除外int
。
请参阅:平等和关系运算符
需要注意的是,在 Dart 中,其identical
工作方式与 Javascript 类似,其中(5.0 == 5)
is true
,但identical(5.0, 5)
is false
。