【问题标题】:How to check if the JSObjectRef object is an array?如何检查 JSObjectRef 对象是否为数组?
【发布时间】:2014-04-30 12:03:27
【问题描述】:

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

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

还有像JSObjectMakeString/JSObjectMakeNumber这样的函数来生成JSObjectRef对象,所以在使用对象时,我找不到像JSObjectIsArray这样的方法来检查对象类型,但它确实有JSValueIsString/JSValueIsNumber方法下JSValueRef.

那么如何判断obj是否为数组呢?

【问题讨论】:

    标签: javascriptcore


    【解决方案1】:

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

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

    【讨论】:

    • 嗨@Emmanuel,我有另一个问题:如果对象是一个数组,如何从中获取元素?谢谢!
    • @Maruku 它是 iOS 9+,所以这个解决方案是为了向后兼容 iOS 8 和更早版本。
    【解决方案2】:

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

    获取数组长度:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多