我正在为v8编写c ++扩展,并希望将Array对象传递给它。我看到传入的参数可以通过IsArray()进行测试,但是没有ToArray()。
如何访问其长度,并通过数字索引请求元素?
Handle<Value> MyExtension(const Arguments& args)
{
Handle<Value> v = args[0];
if(v->IsArray())
{
// convert to array, find its length, and access its members by index... ?
}
...
}
这里必须遗漏一些明显的东西。对象可以返回它的所有属性,但这并不是我所希望的。有没有办法让它成为Arrray?
感谢阅读。
答案 0 :(得分:13)
您应该使用句柄的Cast
方法将其强制转换为其他类型:
v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(v);
答案 1 :(得分:10)
我无法找到转换或转换为Array的方法。也许有办法。但我发现object->IsArray()
,object->get("length")->Uint32Value()
和object->get(int)
,我可以走数组。
v8::Handle<v8::Object> obj;
// ... init obj from arguments or wherever ...
int length = 0;
if(obj->IsArray())
{
length = obj->Get(v8::String::New("length"))->ToObject()->Uint32Value();
}
for(int i = 0; i < length; i++)
{
v8::Local<v8::Value> element = obj->Get(i);
// do something with element
}
答案 2 :(得分:4)
我能够让事情像这样工作,它只是Vyacheslav Egorov给出的答案的变体
Local<Array> arr= Local<Array>::Cast(args[0]);
printf("size %d\n",arr->Length());
Local<Value> item = arr->Get(0);
答案 3 :(得分:3)
以下是我的成功代码
v8::Handle<v8::Value> obj(args[0]);
if(obj->IsArray()){
v8::Local<v8::Array> arr= v8::Local<v8::Array>::Cast(args[0]);
v8::String::Utf8Value key(arr->Get(0));
v8::String::Utf8Value value(arr->Get(1));
}