数组放置更改输出?

时间:2014-07-11 19:48:54

标签: javascript

如果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));

1 个答案:

答案 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));