Dart中"=="和"==="有什么区别?

30

Dart 支持 == 和 === 运算符吗?等于和相同有什么区别?

4个回答

57

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的语义:

  • 如果ab有一个为null,则返回identical(a, b)
  • 否则返回a.==(b)

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


关于相等性和需要注意的问题的补充想法,作者Kevin Moore: http://work.j832.com/2014/05/equality-and-dart.html - tosh

5
需要翻译的内容:

需要注意的是,在dart中使用identical函数有一些注意事项,如此github问题评论中所述:

规范已更新以将double之间的相同性处理为:

identical()函数是预定义的dart函数,如果它的两个参数是:

  • 相同的对象。
  • 类型为int且具有相同的数值。
  • 类型为double,不是NaN,并且具有相同的数值。

这意味着,即使在dart中所有东西都是一个对象,fg是不同的对象,但以下代码会打印出true

int f = 99;
int g = 99;
print(identical(f, g));

因为int类型是通过值来进行比较的,而不是通过引用。


所以回答你的问题,==用于判断两个对象是否具有相同的值,而identical用于测试引用相等性,除了像上面引述的doubleint的情况外。

参见:equality-and-relational-operators


4
作为与JavaScript相关的DART,它也使用了 === 运算符。因此,希望不会很快被踩踏。
身份(identity)作为一个概念,意味着1等于1,但1.0不等于1,false也不等于0,"2"也不等于2,即使每个值都可以相互评估,1==1.0返回true。

1
1.0 == 1 是因为 JavaScript 只有一种数字类型。false != 0。"2" != 2。 - Shannon -jj Behrens
2
Dart 与 JavaScript 的唯一关系是,Dart 通过永远(好吧,几乎不)自动强制转换值来修复错误的问题。而身份作为一个概念只意味着你可以判断系统中一些引用是否指向同一个对象,它与值及其相等性无关。 - Ladicek
在JavaScript中,“身份(identity)”的概念与值有关。a=7.5/2;b=1.25*3; a===b,因为它们是相同类型并且评估为相同值-不是因为它们在某些计算之后内部引用了一个从未存在过的文字“3.5”。 - Aki Suihkonen
1
不完全是这样。JavaScript 中的 === 运算符并不测试身份,而是测试没有强制转换的相等性。这可能是 Dart 中更改它的原因——JavaScript 的人们可能会认为它与相等有关。 - Ladicek

3

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


6
Dart实际上不像JavaScript的"=="那样强制类型转换。这是因为JavaScript只有一种数字类型,所以在JavaScript中"5" == 5.0是true,但在Dart中是false。请注意,这里不提供任何解释或其他信息。 - Shannon -jj Behrens
3
在Dart中,identical(5.0, 5)的结果是true - CopsOnRoad
@CopsOnRoad 当Dart被转译为JavaScript时,identical(5.0, 5)true(因为底层的JavaScript对象是相同的)。在Dart VM中,identical(5.0, 5)false - jamesdlin
@jamesdlin 谢谢,我不知道,但是在DartPad和移动设备上,Dart被转译成什么? - CopsOnRoad
1
Dart在浏览器中(包括DartPad)使用JavaScript。而在其他地方,Dart使用Dart VM。 - jamesdlin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接