我在 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"
? 最佳答案
instanceof
不应该在您的示例 中一直返回 false 除非 您正在测试来自不同窗口的对象,因为来自一个窗口的数组不是不同窗口的 Array
构造函数的实例。
当您需要测试特定事物并且您在一个窗口内操作时,使用 instanceof
非常有用(您必须了解 scunliffe 指出的字符串原语与字符串对象的关系)。请注意,您需要注意您的订单,因为数组是一个 instanceof
Object
(以及 Array
);这也适用于 String
和所有其他对象。
有一个没有窗口问题的替代方案,如果您正在执行调度,它可以很容易地用于 switch
语句等:
function classify(arg) {
return Object.prototype.toString.call(arg);
}
这看起来很奇怪,但它所做的是在
toString
原型(prototype)上使用 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
实例,您都会得到这些结果。关于GWT 中的 Javascript instanceof & typeof (JSNI),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2943805/