首页 > 解决方案 > 为什么相同()在两个字符串上返回true

问题描述

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

因此,如果输入以下代码:

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

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

问题出在哪里。

标签: dart

解决方案


在这种情况下foobar请引用同一个对象。那是因为编译器规范化了字符串文字。

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

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


推荐阅读