如果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));
答案 0 :(得分:1)
实际上,我不同意:这不仅仅是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));