3

我在 GWT 中尝试通过 JSNI 使用某些对象时遇到了一个奇怪的问题。假设我们有定义函数的 javscript 文件:

测试.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"
  • 如何传递这些对象以便正确识别它们?
4

3 回答 3

7

instanceof除非您从不同的窗口测试对象,否则不应在您的示例中一直返回 false ,因为来自一个窗口的数组不是Array不同窗口的构造函数的实例。

当您需要测试特定事物并且您在一个窗口中操作时,使用instanceof非常棒(您必须了解字符串原语与 scunliffe 指出的字符串对象事物)。请注意,您需要注意您的订单,因为数组是instanceof Object(以及Array);这也适用于Strings 和所有其他对象。

有一个没有窗口问题的替代方案,switch如果你正在调度,它可以很容易地用于语句等:

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

这看起来很奇怪,但它所做的是使用原型toString上的函数,该函数Object具有定义的行为(而不是使用您正在测试的实际对象可能具有的任何覆盖,它可能具有不同的行为)。所以给定这个函数:

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实例,您都会得到这些结果。

于 2010-05-31T13:51:27.787 回答
1

由于其他所有问题似乎都已得到解答,让我得到这个:

如何传递这些对象以便正确识别它们?

GWT 会自动为字符串、整数等原始类型执行此操作。因此您可以只写:

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

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

有关一些额外说明,请参阅文档

对于数组,有一堆包装类:JsArray, JsArrayBoolean, JsArrayInteger, JsArrayNumber, JsArrayString

public static native JsArrayString test3()/ *-{
   return ['foo', 'bar', 'baz'];
}-*/;
于 2010-05-31T22:36:21.243 回答
0

您的测试函数总是返回 false,因为您不提供 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);
  }
}

(注意还有其他类型……日期、数字、自定义对象等)

于 2010-05-31T13:30:04.003 回答