如果RegExp
在数组的末尾,则输出返回object的值。但是,如果它在数组中的其他位置,则返回RegExp
。这是为什么?
var val_type = [Function, Boolean, Number, String, Object, RegExp];
// Any where else returns value of RegExp, but why not at the end?
function type(arg) {
if(typeof arg === "object" || typeof arg === "function") {
for(var i = 0; i < val_type.length; i++) {
if (arg instanceof val_type[i]) {
return val_type[i];
}
}
}
return typeof arg;
}
alert(val_type(/j/i));
最佳答案
实际上,我希望有所不同:这不仅发生在RegExp
位于数组末尾时,还不止于此。只要Object
在RegExp
之前,就会发生这种情况。同样,Function
也会发生同样的情况。
这是因为所有函数,数组和正则表达式都从Object
继承。尽管Object
可能不是其构造函数,但它们的构造函数继承自Object
,因此它们也是这样,因此instanceof
运算符将其视为实例。
要解决此问题,请检查.constructor
属性而不是instanceof
。有时,instanceof
可用于检查对象是否仅从构造函数继承(即,检查Node
是否从Element
继承以查看它是否是元素),但有时,我们希望更加严格,因此我们使用.constructor
属性:
var val_type = [Function, Boolean, Number, String, Object, RegExp, Array]; //Don't forget Array!
function type(arg) {
if(typeof arg === "object" || typeof arg === "function") {
for(var i = 0; i < val_type.length; i++) {
if (arg.constructor == val_type[i]) {
return val_type[i]; //_Now_ it returns the correct constructor...
}
}
}
//...unless it's a primitive type, in which case, we just use typeof
return typeof arg;
}
alert(type(/j/i));