4

在我的实现中,我向 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()andIsStringObject()我可以确保对象是数字或字符串。

但现在我需要区分整数值和浮点数。执行此测试的最佳方法是什么?有没有办法调用/使用typeof暴露给 JS 的函数?

4

3 回答 3

5

快速回答

v8::Value::NumberValue()将返回 javascript Number的值而不会丢失精度。

解释

确实,int64_tdouble可表示的数字集是不同的。因此,如果值实际上是int64_t时,自然会担心会发生什么,因为 v8::Value 定义了两者

V8EXPORT int64_t v8::Value::IntegerValue() const;
V8EXPORT double v8::Value::NumberValue() const;

什么是 v8::Number?

考虑 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

结果

9223372036854776000
于 2014-08-09T21:14:17.817 回答
4

尝试IsInt32IsUint32()检查数字是否为整数。

https://github.com/v8/v8/blob/master/include/v8.h#L1313

于 2013-06-19T03:01:36.863 回答
0

尝试使用这条线;

bool isInt = ( num->NumberValue() ) % 1 == 0;

NumberValue返回double带有数字值的a,% 1 == 0如果返回的值能被 1 整除,则返回 true。

于 2013-07-17T17:08:01.133 回答