【发布时间】:2012-11-07 18:03:35
【问题描述】:
Dart 是否支持 == 和 === ?平等和身份有什么区别?
【问题讨论】:
标签: dart
Dart 是否支持 == 和 === ?平等和身份有什么区别?
【问题讨论】:
标签: 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 问题 comment 中提到的那样:
规范已更新,以对待双打之间的相同 像这样:
相同的()函数是预定义的飞镖函数,它返回 如果它的两个参数是任何一个,则为真:
- 同一个对象。
- int 类型且具有相同的数值。
- double 类型,不是 NaN,具有相同的数值。
这意味着即使 dart 中的 everything 是一个对象,而 f 和 g 是不同的对象,以下打印出 true。
int f = 99;
int g = 99;
print(identical(f, g));
因为整数的值相同,而不是引用。
所以为了回答您的问题,== 用于识别两个对象是否具有相同的值,但 identical 用于测试引用相等性,除非double 和int 被识别为由上面的摘录。
【讨论】:
据说 DART 与存在 === 的 javascript 相关,我希望不要很快被否决。
身份作为一个概念意味着 1 等于 1,但 1.0 不等于 1,false 也不等于 0,“2”也不等于 2,即使每个人评估并且 1==1.0 返回 true。
【讨论】:
需要注意的是,在 Dart 中,identical 的工作方式类似于 Javascript,其中 (5.0 == 5) 是 true,但 identical(5.0, 5) 是 false。
【讨论】:
identical(5.0, 5) 在 Dart 中是 true。
identical(5.0, 5) 在 Dart 被转译为 JavaScript 时是 true(因为底层 JavaScript 对象是相同的)。 identical(5.0, 5) 在 Dart 虚拟机中是 false。