如果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位于数组末尾时,还不止于此。只要ObjectRegExp之前,就会发生这种情况。同样,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));

09-10 11:58
查看更多