【问题标题】:What is the difference between == and === in Dart?Dart 中 == 和 === 有什么区别?
【发布时间】:2012-11-07 18:03:35
【问题描述】:

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

【问题讨论】:

    标签: dart


    【解决方案1】:

    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) 检查两个变量是否引用同一个实例。 identicaldart:core 中的顶级函数。

    【讨论】:

    【解决方案2】:

    需要注意的是,在 dart 中使用 identical 函数有一些注意事项,正如这个 github 问题 comment 中提到的那样:

    规范已更新,以对待双打之间的相同 像这样:

    相同的()函数是预定义的飞镖函数,它返回 如果它的两个参数是任何一个,则为真:

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

    这意味着即使 dart 中的 everything 是一个对象,而 fg 是不同的对象,以下打印出 true

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

    因为整数的值相同,而不是引用。


    所以为了回答您的问题,== 用于识别两个对象是否具有相同的值,但 identical 用于测试引用相等性,除非doubleint 被识别为由上面的摘录。

    见:equality-and-relational-operators

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 1.0 == 1 因为 JavaScript 只有一种类型的数字。假!= 0。“2”!= 2。
      • Dart 与 JavaScript 的唯一关系是 Dart 通过从不(好吧,几乎从不)自动强制值来修复损坏的东西。而身份作为一个概念只是意味着你可以判断系统中的某些引用是否指向同一个对象,它与值及其相等性无关。
      • 身份作为javascript中的概念与值有关。 a=7.5/2;b=1.25*3; a===b,因为它们是相同的类型并计算为相同的值——而不是因为它们在经过一些计算后在内部引用了从未存在过的文字“3.5”。
      • 并非如此。 JavaScript 中的 === 运算符不测试身份,而是测试没有强制的相等性。这可能是 Dart 中改变它的原因——JavaScript 人可能认为它与平等有关。
      【解决方案4】:

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

      【讨论】:

      • Dart 实际上并不像 == 在 JavaScript 中那样强制执行。只是 JavaScript 只有一种数字类型。因此,"5" == 5.0 在 JavaScript 中为真,但在 Dart 中为假。
      • identical(5.0, 5) 在 Dart 中是 true
      • @CopsOnRoad identical(5.0, 5) 在 Dart 被转译为 JavaScript 时是 true(因为底层 JavaScript 对象是相同的)。 identical(5.0, 5) 在 Dart 虚拟机中是 false
      • @jamesdlin 谢谢,不知道,但是 Dart 会在 DartPad 和移动设备上转换成什么?
      • 浏览器(包括 DartPad)中的 Dart 使用 JavaScript。其他任何地方的 Dart 都使用 Dart VM。
      猜你喜欢
      • 2020-08-16
      • 2021-12-17
      • 2020-12-04
      • 2014-01-21
      • 2019-08-19
      • 2020-08-25
      • 1970-01-01
      • 2016-04-14
      • 2019-12-21
      相关资源
      最近更新 更多