27

Dart 是否支持 == 和 === ?平等和身份有什么区别?

4

4 回答 4

53

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是:

  • 如果要么 要么abnull返回identical(a, b)
  • 否则,返回a.==(b)

用于identical(a, b)检查两个变量是否引用同一个实例。same是在 中找到的顶级函数dart:core

于 2012-11-07T18:03:35.023 回答
4

由于据说 DART 与存在 === 的 javascript 相关,我希望不要很快被否决。

身份作为一个概念意味着 1 等于 1,但 1.0 不等于 1,false 也不等于 0,“2”也不等于 2,即使每个都相互评估并且 1==1.0 返回 true。

于 2012-11-07T18:10:38.290 回答
4

应该注意的是,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

请参阅:平等和关系运算符

于 2020-08-16T23:38:00.817 回答
3

需要注意的是,在 Dart 中,其identical工作方式与 Javascript 类似,其中(5.0 == 5)is true,但identical(5.0, 5)is false

于 2012-11-07T19:03:04.520 回答