为什么 V8 isValidSmi 本机函数 returns 对浮点数为真?

Why does V8 isValidSmi native function returns true on float number?

不明白为什么 V8 原生函数 %isValidSmi(2.2) returns true in Nodejs.

NodeJS 版本:8.9.4

我还以为是SMI number 有点像int32

(这里是 V8 开发人员。)简而言之,因为它在查看值之前执行 NumberToInt32 转换。

您可能会说这是一个令人惊讶的实施选择,事实上我无法告诉您为什么这样做。显然对于这个内部助手的预期用例,由此产生的行为是可以接受的,甚至是需要的。

"internal helper" 是这里的关键词。 V8 的内部 "runtime functions" 不打算用于 public 用法,因此它们不会默认公开,它们没有指定或标准化或记录,并且它们通常对它们接受的参数有相当的限制(例如,%IsValidSmi({}) 将崩溃而不是返回 false,因为它不是为处理任意输入而设计的)。作为 V8 开发人员,您只需查看代码,看看给定的运行时函数是否满足您的需求,而作为非 V8 开发人员,您没有理由关心 :-)

撇开这些实现细节,您的理解是正确的,2.2 不是有效的 Smi。碰巧 %IsValidSmi() 不是确定它的合适方法。 FWIW,还有 %IsSmi(value),它检查 value 当前是否 在内部表示为 Smi —— 这与 的数字明显不同可以 表示为 Smi。

无论哪种方式,我们的官方建议是您的代码不应该关心 V8 选择将哪些值表示为 Smis。特别是,这也会随着时间的推移而变化,既会在 运行 单个程序的过程中,也会随着 V8 版本的变化而变化。