Dart支持==和===吗?平等和身份有什么区别?
答案 0 :(得分:27)
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 = new Person('111', 'Bob');
var robert = new 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
中的顶级函数。
答案 1 :(得分:3)
应该注意的是,在Dart中,identical
的工作方式类似于Javascript,其中(5.0 == 5)
为true
,但identical(5.0, 5)
为false
。
答案 2 :(得分:2)
由于DART被认为与javascript有关,===存在,我希望不会很快被投票。
作为概念的身份意味着1等于1,但1.0不等于1,假等于0,“2”也不等于2,即使每个相互评估并且1 == 1.0返回true。
答案 3 :(得分:0)
应该注意,在dart中使用identical
函数有一些注意事项,如本github问题comment所述:
该规范已更新,可以在双打之间进行相同处理 像这样:
same()函数是预定义的dart函数,该函数返回 如果它的两个参数是:
- 同一个对象。
- 类型为int且具有相同的数值。
- double类型的不是NaN,并且具有相同的数值。
这意味着即使dart中的every thing是一个对象,并且f
和g
是不同的对象,以下打印true
。
int f = 99;
int g = 99;
print(identical(f, g));
因为int的值相同,而不是引用相同。
因此,为回答您的问题,==
用于标识两个对象是否具有相同的值,但是identical
用于测试引用相等,除非是double
和上面摘录所标识的int
。