如何将v8值转换为数组

dav*_*ink 15 javascript c++ v8

我正在为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... ?
    }
...
}
Run Code Online (Sandbox Code Playgroud)

必须遗漏一些明显的东西.对象可以返回它的所有属性,但这并不是我所希望的.有没有办法让它成为Arrray?

谢谢阅读.

Vya*_*rov 13

您应该使用Cast句柄方法将其强制转换为其他类型:

v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(v);
Run Code Online (Sandbox Code Playgroud)


dav*_*ink 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
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我能够让事情像这样工作,这只是 Vyacheslav Egorov 给出的答案的一个变体

Local<Array> arr= Local<Array>::Cast(args[0]);
printf("size %d\n",arr->Length());
Local<Value> item = arr->Get(0);
Run Code Online (Sandbox Code Playgroud)