一个值如何同时是整数、双精度和麻木类型?

How a value can be of type integer, double & num at the same time?

我有以下表达式:

const value = 10 / 2;

在 VS Code 中,如果我将鼠标悬停在 value 上,它会显示它的类型是 double,这是有道理的。但是如果我 运行 下面的代码行,它们的计算结果都是 true:

print(value is num); // true
print(value is double); // true
print(value is int); // true

num 是超级 class,doubleint 是兄弟 class。为什么一个值同时是兄弟类型和超类型?

尝试

import 'dart:io';
 
void main() {
    const value = 10 / 2;
    print(value is num); // true
    print(value is double); // true
    print(value is int); // true
}

输出为:

true true false

这是预期的结果。

您正在为 Web 编译,并且 运行 在浏览器中。 DartPad 会为你做这件事,如果你使用网络编译器(dart2js 或 dev-compiler)编译你的程序,你会得到同样的效果。

在为 web 编译 Dart 时,所有数字都被编译为 JavaScript 数字,因为这是获得高效执行的唯一方法。

JavaScript 没有整数作为单独的类型。所有 JavaScript 数字都是 IEEE-754 双精度浮点数,Dart 称之为 doubles.

所以,当你有一个像 10 / 2 这样的数字时,它会在原生 Dart 中创建一个 double,它会在网络上创建 JavaScript 数字 5.0。整数文字 5 也是如此。浏览器中只有一个“5”数字,因此整数和双精度计算都创建相同的数字。

为了与类型系统保持一致,这意味着“5”是一个同时实现 intdouble 接口的值。 5.5 之类的小数值仅实现 double.

当 运行 原生时,整数和双精度是不同的类型。

这是全部described in the Dart language tour