9

我将 V8 作为辅助语言嵌入到 C++ 程序中。

Handle<Value>当我调用类似的东西时,我从 V8检索

Handle<Value> value_handle = context->Global()->Get(key_handle);

然后我可以发现它是(比如说)一个带有value_handle->IsString(). 如果是这样,我可以将其转换为 aHandle<String>以访问其特定于字符串的方法。

但似乎有两种方法可以做到这一点:

Handle<String> string = value_handle->ToString();

或者

Handle<String> string = Handle<String>::Cast(value_handle);

但是,对于数组和函数,没有toArray()ortoFunction方法,只有强制转换。

所以我的问题是:a)是ToXXX铸造的唯一语法糖吗?并且,如果不是 b) 该ToXXX方法在做什么?

4

2 回答 2

9

ToXXX函数执行类型强制,如ECMA-262 5th第 9 节的小节中所述。例如ToString第 9.8 节中描述:当给定一个非字符串值时,它将返回一个适当的字符串表示形式,如果您传递对象,它将调用toString它的方法(或者valueOf如果toString不存在)。相关代码ToString: inapi.cc Value::ToString调用runtime.js ToString

另一方面Handle<XXX>::Cast(...)没有强制。这只是句柄的类型转换。本质上它只是一个static_cast<XXX*>. 在调试模式下Handle<T>::Cast(...)检查并在类型不匹配时中止执行。如果给你一个Handle<Value>包含 anObject并且你试图将它转换为 a ,这将是一个致命错误Handle<String>。在发布模式下,当您尝试使用转换的结果时,转换为不兼容的类型稍后会导致奇怪的结果并可能崩溃。相关代码,v8.h Handle<T>::Cast其中委托(例如String::Cast)通过String::CheckCast.

于 2013-02-22T09:40:48.077 回答
0

我们可以定位

V8EXPORT 本地 ToString() 常量;

在第 971 行,v8.h 其中 V8EXPORT 是一种依赖于操作系统的函数方法。


字符串句柄的 ToString 位于 api.cc 的第 2362 行

Local<String> Value::ToString() const {
  i::Handle<i::Object> obj = Utils::OpenHandle(this);
  i::Handle<i::Object> str;
  if (obj->IsString()) {
    str = obj;
  } else {
    i::Isolate* isolate = i::Isolate::Current();
    if (IsDeadCheck(isolate, "v8::Value::ToString()")) {
      return Local<String>();
    }
    LOG_API(isolate, "ToString");
    ENTER_V8(isolate);
    EXCEPTION_PREAMBLE(isolate);
    str = i::Execution::ToString(obj, &has_pending_exception);
    EXCEPTION_BAILOUT_CHECK(isolate, Local<String>());
  }
  return Local<String>(ToApi<String>(str));
}

为了保持一致性并利用 V8 版本的进一步升级,我强烈建议使用 toString() 而不是原始转换。

于 2013-02-22T06:08:50.950 回答