2014-04-30 84 views
1

在JavaScriptCore的,我們可以使用該代碼生成一個數組對象:如何檢查JSObjectRef對象是否是數組?

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

有是也像JSObjectMakeString/JSObjectMakeNumber函數產生JSObjectRef對象,所以使用的對象時,我無法找到諸如JSObjectIsArray的方法來檢查對象的類型,但它的確有JSValueIsString/JSValueIsNumber方法,在JSValueRef之下。

那麼如何檢查obj是否是一個數組?

回答

2

要檢查的對象是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; 
} 
+0

嗨@Emmanuel,我得到了另外一個問題:如果對象是一個數組,如何獲得它的元素?謝謝! –

+1

好的,我現在得到了答案。 –

+0

https://developer.apple.com/documentation/javascriptcore/1395924-jsvalueisarray – Maruku

3

我發現了一些其他陣列操作,我想在這裏粘貼代碼來幫助其他人。

GET數組長度:通過索引

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

GET數組元素:

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