为什么 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 版本的变化而变化。
不明白为什么 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 版本的变化而变化。