identical 函数

bool identical(
  1. Object? a,
  2. Object? b
)

检查两个对象引用是否指向同一对象。

Dart 中的值,存储在变量中的值,是对象引用。可能存在多个引用指向同一对象。

Dart 对象有一个标识符,它将其与其他对象区分开来,即使这些对象的状态相同。identical 函数揭示了两个对象引用是否指向相同的对象。

如果identical调用返回true,则保证无法区分两个参数。如果它返回false,则只知道参数不是同一个对象。

生成器(非工厂)构造函数的非常量调用,或评估非常量列表、集合或映射字面量,总是会创建一个新的对象,该对象与任何现有对象都不相同。

常量规范化 确保两个在编译时创建具有相同状态的对象的常量表达式的结果也评估为引用相同的规范实例。例如

print(identical(const <int>[1], const <int>[1])); // true

整数和双精度浮点数是特殊的,它们根本不允许创建新的实例。如果两个整数相等,它们也始终相同。如果两个双精度浮点数具有相同的二进制表示,它们是相同的(在Web平台上关于double.nan-0.0有一些注意事项)。

Record 值没有持久的标识符。这允许编译器将记录拆分为其部分,并在以后重新构建它,而无需担心创建具有相同标识符的对象。如果所有对应的字段都相同,记录可能与形状相同的另一个记录相同,也可能不同,但它永远不会与任何其他东西相同。

示例

var o = new Object();
var isIdentical = identical(o, new Object()); // false, different objects.
isIdentical = identical(o, o); // true, same object.
isIdentical = identical(const Object(), const Object()); // true, const canonicalizes.
isIdentical = identical([1], [1]); // false, different new objects.
isIdentical = identical(const [1], const [1]); // true.
isIdentical = identical(const [1], const [2]); // false.
isIdentical = identical(2, 1 + 1); // true, integers canonicalize.

var pair = (1, "a"); // Create a record.
isIdentical = identical(pair, pair); // true or false, can be either.

var pair2 = (1, "a"); // Create another(?) record.
isIdentical = identical(pair, pair2); // true or false, can be either.

isIdentical = identical(pair, (2, "a")); // false, not identical values.
isIdentical = identical(pair, (1, "a", more: true)); // false, wrong shape.

实现

external bool identical(Object? a, Object? b);