如何检查JSObjectRef对象是否是一个数组?

时间:2014-04-30 12:03:27

标签: javascriptcore

在javascriptcore中,我们可以使用以下代码生成数组对象:

JSObjectRef array = JSObjectMakeArray(ctx, 0, NULL, NULL)

还有JSObjectMakeString / JSObjectMakeNumber之类的函数来生成JSObjectRef对象,因此在使用对象时,我找不到像JSObjectIsArray这样的方法来检查对象类型,但是在JSValueRef下有JSValueIsString / JSValueIsNumber方法。

那么如何检查obj是否是一个数组?

2 个答案:

答案 0 :(得分:3)

要检查对象是否是带有JavaScript的数组,您可以使用Array.isArray(obj)(对于支持它的浏览器),如JavaScriptCore实现它,您可以编写自己的JSValueIsArray函数,如下所示:< / p>

bool JSValueIsArray(JSContextRef ctx, JSValueRef value)
{
    if (JSValueIsObject(ctx, value))
    {
        JSStringRef name = JSStringCreateWithUTF8CString("Array");

        JSObjectRef array = (JSObjectRef)JSObjectGetProperty(ctx, JSContextGetGlobalObject(ctx), name, NULL);

        JSStringRelease(name);

        name = JSStringCreateWithUTF8CString("isArray");
        JSObjectRef isArray = (JSObjectRef)JSObjectGetProperty(ctx, array, name, NULL);

        JSStringRelease(name);

        JSValueRef retval = JSObjectCallAsFunction(ctx, isArray, NULL, 1, &value, NULL);

        if (JSValueIsBoolean(ctx, retval))
            return JSValueToBoolean(ctx, retval);
    }
    return false;
}

答案 1 :(得分:3)

我发现了一些其他的数组操作,我想在这里粘贴代码以帮助其他人。

获取数组长度:

int JSArrayGetCount(JSContextRef ctx, JSObjectRef arr)
{
    JSStringRef pname = JSStringCreateWithUTF8CString("length");
    JSValueRef val = JSObjectGetProperty(ctx, arr, pname, NULL);
    JSStringRelease(pname);
    return JSValueToNumber(ctx, val, NULL);
}

按索引获取数组元素:

JSValueRef JSArrayGetValueAtIndex(JSContextRef ctx, JSObjectRef arr, int index)
{
    return JSObjectGetPropertyAtIndex(ctx, arr, index, NULL);
}