【问题标题】:why identical() return true on two strings为什么相同()在两个字符串上返回true
【发布时间】:2019-05-28 16:41:20
【问题描述】:

我是 Dart 新手。文档说:“要测试两个对象 x 和 y 是否代表相同的事物,请使用 == 运算符。(在极少数情况下,您需要知道两个对象是否完全相同,请改用 same() 函数.)"

所以,如果输入以下代码:

var foo = 'bar';
var baz = 'bar';
print(identical(foo, baz));

如果我很好理解的话, foo 和 bar 不会引用同一个对象。所以 same() 必须返回 false,不是吗? 但事实并非如此,至少在 DartPad 中是这样。

问题出在哪里。

【问题讨论】:

    标签: dart


    【解决方案1】:

    在这种情况下,foobar 确实引用了同一个对象。 那是因为编译器 canonicalizes 字符串文字。

    规范要求对大多数常量进行规范化。如果您在两个地方创建const Duration(seconds: 1),它将成为相同的 对象。整数、双精度和布尔值总是规范化的,无论是否为常量(该语言假装每个值只有一个实例)。

    字符串的特殊之处在于规范对它们是否需要规范化并不完全清楚,但是constant字符串需要规范化以使常量有意义,并且所有编译器都这样做。 文字是一个常量表达式,因此字符串文字总是被规范化的。这意味着'bar' 表示同一个对象,无论它出现在代码中的什么位置。

    【讨论】:

    • 感谢您的回答。但是如果我通过代码构建字符串(例如使用简单的列表:var chars = ['b','a','r'];,然后在两个变量上应用相同的循环:chars.forEach((item ) {foo += item;}); chars.forEach((item) {baz += item;}); "identical" 再次返回 true,虽然它现在不是文字。奇怪。
    • 如果您将代码编译为 JavaScript,那么任何相等的字符串也是相同的。那是因为 JavaScript 没有提供任何方法来区分具有相同内容的两个字符串。 Dart 编译器将 identical(a, b) 编译为 JavaScript a === b 并且相等的字符串在 JavaScript 中也是 ===。如果代码在 VM 上运行,这两个字符串可能会不相同。
    【解决方案2】:

    对于多个内置“文字”,您将始终获得相同的 true 以获得相同的值。

    • 布尔
    • 字符串
    • int
    • 双倍(我认为)

    【讨论】:

      猜你喜欢
      • 2012-07-20
      • 1970-01-01
      • 2014-04-17
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多