在v8中为值句柄转换为ToXXX

Ian*_*Ian 9 javascript c++ v8

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

Handle<Value>当我打电话的时候,我从V8中检索了一个

Handle<Value> value_handle = context->Global()->Get(key_handle);
Run Code Online (Sandbox Code Playgroud)

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

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

Handle<String> string = value_handle->ToString();
Run Code Online (Sandbox Code Playgroud)

要么

Handle<String> string = Handle<String>::Cast(value_handle);
Run Code Online (Sandbox Code Playgroud)

但是,对于数组和函数,没有toArray()toFunction方法,只有转换.

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

Vya*_*rov 9

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

另一方面Handle<XXX>::Cast(...)没有强制.它只是手柄的类型转换.基本上它只是一个static_cast<XXX*>.在调试模式下Handle<T>::Cast(...)检查并在类型不匹配时中止执行.如果给你一个Handle<Value>包含的Object并且你正试图将它投射到一个,这将是一个致命的错误Handle<String>.在释放模式下,当您尝试使用强制转换的结果时,转换为不兼容的类型将导致奇怪的结果并可能导致崩溃.代理v8.h Handle<T>::Cast(例如)String::Cast通过代理检查演员表(如果启用了支票)的相关代码String::CheckCast.