在我的实现中,我为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
}
}
现在这个参数基本上可以有任何类型。因为我支持Int,Float和String我想有效地检查这些类型。使用IsNumber()
和IsStringObject()
我可以确保对象是数字或字符串。
但现在我需要区分整数值和浮点数。执行此测试的最佳方法是什么?有没有办法调用/使用公开给JS的typeof
函数?
答案 0 :(得分:4)
请尝试IsInt32
或IsUint32()
检查号码是否为整数。
答案 1 :(得分:3)
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;
考虑v8 :: Number doc
详细说明
JavaScript编号值(ECMA-262, 4.3.20)
IntegerValue 会返回 int64_t ,但会有no more precision available,因为该值在内部存储为双精度64位二进制格式IEEE 754值。
检查javascript是否可以代表 double 所不能的值,但 int64_t 可以。< / p>
2 ^ 63 - 1等于9223372036854775807
尝试在javascript控制台中输入以下内容;这个值被解析但是额外的精度被抛弃了,因为double不能代表它。
>9223372036854775807
结果
9223372036854776000
答案 2 :(得分:0)
尝试使用此行;
bool isInt = ( num->NumberValue() ) % 1 == 0;
NumberValue返回带有数字值的double
,如果返回的值可以被1整除,则% 1 == 0
将返回true。