2010-05-31 45 views
3

我在GWT中嘗試通過JSNI使用某些對象時遇到了一個奇怪的問題。比方說,我們有一個函數javscript文件中定義:在GWT中使用Javascript instanceof&typeof(JSNI)

test.js:

function test(arg){ 
    var type = typeof(arg); 
    if (arg instanceof Array) 
    alert('Array'); 
    if (arg instanceof Object) 
    alert('Object'); 
    if (arg instanceof String) 
    alert('String'); 
} 

而且我們要調用這個函數用戶JSNI:

public static native void testx()/ *-{ 
    $wnd.test(new Array(1, 2, 3)); 
    $wnd.test([ 1, 2, 3 ]); 
    $wnd.test({val:1}); 
    $wnd.test(new String("Some text")); 
}-*/; 

的問題是:

  • 爲什麼instanceof指令將始終返回false
  • 爲什麼typeof會一直返回"object"
  • 如何傳遞這些對象以便正確識別它們?
+1

「string」(一個字符串文字)和new String(「string」)(一個String對象)之間有區別。此外,任何不是文字的東西都是一個對象(除了IE中的一些情況),所以對象測試應該是最後的,特別是。如果你使用return語句。 – Dormilich 2010-05-31 13:35:10

+0

感謝您的評論,$ wnd.test(new String(「Some text」));在這種情況下也是一樣。 – rafalry 2010-05-31 14:09:45

回答

7

instanceof不應返回false所有的時間在你的例子除非你測試對象從不同的窗口,因爲從一個窗口的數組是而不是一個不同窗口的Array構造函數的一個實例。

使用instanceof當你需要測試一個特定的東西,並且你正在一個窗口內操作時(你必須意識到scunliffe指出的字符串基元與字符串對象的事情)是非常棒的。請注意,由於數組是instanceofObject(以及Array),所以您需要小心您的訂單;這適用於String以及所有其他對象。

有不具有窗口的問題,如果你正在做調度,可以容易地用於switch報表,喜歡另類:

function classify(arg) { 
    return Object.prototype.toString.call(arg); 
} 

這看起來很奇怪,但它的作用是在Object原型上使用toString函數,該函數具有已定義的行爲(而不是使用您正在測試的實際對象可能具有的可能具有不同行爲的任何覆蓋)。因此,考慮這樣的功能:

function show(arg) { 
    alert(classify(arg)); 
} 

你將得到這些結果:

show({});    // [object Object] 
show("a");    // [object String] 
show(new String("a")); // [object String] 
show([]);    // [object Array] 
show(/n/);    // [object RegExp] 
show(function() { }); // [object Function] 

,你會得到這些結果,無論什麼窗口正在測試的對象是從哪裏來的,也無論是否您使用字符串原語或String實例。

+0

其簡單令人印象深刻! – scunliffe 2010-05-31 14:32:38

0

測試函數總是返回假的,因爲你沒有提供return語句...和String是在JavaScript搞笑......如果你使用new String("asdf");然後使用的instanceof會的工作,如果你只是創建"asdf"字符串那麼你將需要使用typeof。

function test(arg){ 
    if (arg instanceof Array){ 
    return 'Array'; 
    } else if(arg instanceof String || typeof(arg) == 'String'){ 
    return 'String'; 
    } else if (arg instanceof Object){ 
    return 'Object'; 
    } else { 
    return typeof(arg); 
    } 
} 

(注意有其他類型的...日期,數字,自定義對象等)

1

因爲一切似乎已經回答了,讓我得到這個:

如何通過這些對象,使他們正確識別?

GWT做這個自動的對原始類型,如字符串,整數,等於是你可以這樣寫:

public static native String test1()/ *-{ 
    return "adfasdf"; 
}-*/; 

public static native int test2()/ *-{ 
    return 23; 
}-*/; 

the docs一些額外的注意事項。

對於數組,有一堆封裝類:JsArrayJsArrayBooleanJsArrayIntegerJsArrayNumberJsArrayString

public static native JsArrayString test3()/ *-{ 
    return ['foo', 'bar', 'baz']; 
}-*/;