在我的实现中,我为JavaScript提供了一个接受参数的函数。
v8::Handle<v8::Value> TableGetValueIdForValue(const v8::Arguments& args) {
v8::Isolate* isolate = v8::Isolate::GetCurrent();
v8::HandleScope handle_scope(isolate);
auto val = args[1];
if (val->IsNumber()) {
auto num = val->ToNumber();
// How to check if Int or Double
} else {
// val == string
}
}
Run Code Online (Sandbox Code Playgroud)
现在,此参数基本上可以具有任何类型。当我支持Int,Float和String时,我想有效地检查这些类型。使用IsNumber()和IsStringObject()我可以确保对象是数字或字符串。
但是现在我需要区分整数值和浮点数。进行此测试的最佳方法是什么?有没有一种方法可以调用/使用typeof暴露给JS 的函数?
v8 :: Value :: NumberValue()将返回javascript Number的值而不会降低精度。
的确,由int64_t和double表示的数字集是不同的。因此很自然地担心如果值实际上是int64_t会发生什么,因为v8 :: Value定义了两者
V8EXPORT int64_t v8::Value::IntegerValue() const;
V8EXPORT double v8::Value::NumberValue() const;
Run Code Online (Sandbox Code Playgroud)
考虑v8 :: Number文档
详细说明
JavaScript数字值(ECMA-262,4.3.20)
IntegerValue确实返回int64_t,但是将没有其他精度可用,因为该值在内部存储为双精度64位二进制格式IEEE 754值。
检查javascript是否可以代表double不能但int64_t可以的值。
2 ^ 63-1等于9223372036854775807
尝试在javascript控制台中键入以下内容;会解析此值,但会丢弃多余的精度,因为double无法表示它。
>9223372036854775807
Run Code Online (Sandbox Code Playgroud)
结果
9223372036854776000
Run Code Online (Sandbox Code Playgroud)