一个值如何同时是整数、双精度和麻木类型?
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,double
和 int
是兄弟 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 称之为 double
s.
所以,当你有一个像 10 / 2
这样的数字时,它会在原生 Dart 中创建一个 double
,它会在网络上创建 JavaScript 数字 5.0。整数文字 5
也是如此。浏览器中只有一个“5”数字,因此整数和双精度计算都创建相同的数字。
为了与类型系统保持一致,这意味着“5”是一个同时实现 int
和 double
接口的值。 5.5
之类的小数值仅实现 double
.
当 运行 原生时,整数和双精度是不同的类型。
我有以下表达式:
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,double
和 int
是兄弟 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 称之为 double
s.
所以,当你有一个像 10 / 2
这样的数字时,它会在原生 Dart 中创建一个 double
,它会在网络上创建 JavaScript 数字 5.0。整数文字 5
也是如此。浏览器中只有一个“5”数字,因此整数和双精度计算都创建相同的数字。
为了与类型系统保持一致,这意味着“5”是一个同时实现 int
和 double
接口的值。 5.5
之类的小数值仅实现 double
.
当 运行 原生时,整数和双精度是不同的类型。