identical 函数
检查两个对象引用是否指向同一对象。
Dart 值,存储在变量中,是 对象引用。可能有多个引用指向同一对象。
每个 Dart 对象都有一个 身份,使之与其他对象区分开来,即使它们的其他状态相同。函数 identical
揭示了两个对象引用是否指向 同一 对象。
如果 identical
调用返回 true
,则保证无法区分这两个参数。如果返回 false
,则仅知道参数不是同一对象。
生成器(非工厂)构造函数的非常量调用,或评估非常量列表、集合或映射文字,始终创建一个新的对象,该对象与任何现有对象都不相同。
常量规范 确保构建具有相同状态的对象的两个编译时常量表达式的结果也评估为引用相同的、规范化的实例。示例
print(identical(const <int>[1], const <int>[1])); // true
整数和双精度浮点数是特殊的,它们根本不允许创建新的实例。如果两个整数相等,它们总是相同的。如果两个双精度浮点数具有相同的二进制表示,它们是相同的(在网络平台上对 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);