我在V ++程序中嵌入V8作为辅助语言。
当我打电话给
时,我从V8中检索Handle<Value>
Handle<Value> value_handle = context->Global()->Get(key_handle);
然后我可以发现它是(比方说)带有value_handle->IsString()
的字符串。如果是这样,我可以将其转换为Handle<String>
以访问其特定于字符串的方法。
但似乎有两种方法可以做到:
Handle<String> string = value_handle->ToString();
或
Handle<String> string = Handle<String>::Cast(value_handle);
但是,对于数组和函数,没有toArray()
或toFunction
方法,只有转换。
所以我的问题是:
a)ToXXX
只是用于铸造的语法糖?
并且,如果不是b)ToXXX
方法在做什么?
答案 0 :(得分:8)
ToXXX
函数执行类型强制,如ECMA-262 5th的section 9小节中所述。例如,section 9.8中描述了ToString
:当给定非字符串值时,它将返回一个适当的字符串表示形式,如果您正在传递对象,它将调用toString
方法它(如果valueOf
不存在,则为toString
)。调用ToString
Value::ToString
api.cc
ToString
runtime.js
的相关代码
另一方面,Handle<XXX>::Cast(...)
没有强制。它只是手柄的类型转换。基本上它只是一个static_cast<XXX*>
。在调试模式下,检查Handle<T>::Cast(...)
并在类型不匹配时中止执行。如果您获得包含Handle<Value>
的{{1}}并且您正尝试将其投放到Object
,则会出现致命错误。在释放模式下,当您尝试使用强制转换的结果时,转换为不兼容的类型将导致奇怪的结果并可能导致崩溃。 Handle<String>
Handle<T>::Cast
中的相关代码委托(例如)String::Cast
通过String::CheckCast
检查演员表(如果启用了支票)。
答案 1 :(得分:0)
我们可以找到
在V8EXPORT Local ToString()const;
v8.h
的第971行其中V8EXPORT是一种依赖于操作系统的函数方法。
Handle of String的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()而不是原始版本。