15

我正在为 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... ?
    }
...
}

必须在这里遗漏一些明显的东西。Object 可以返回它的所有属性,但这并不是我所希望的。有没有办法把它作为一个数组?

谢谢阅读。

4

4 回答 4

13

您应该使用Cast句柄的方法将其转换为不同的类型:

v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(v);
于 2012-07-29T08:14:16.597 回答
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
}
于 2012-07-29T20:03:44.417 回答
5

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

Local<Array> arr= Local<Array>::Cast(args[0]);
printf("size %d\n",arr->Length());
Local<Value> item = arr->Get(0);
于 2014-01-30T23:51:49.930 回答
3

The below is my succeeded code

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));

 }
于 2014-04-15T02:11:17.180 回答