这是确定JavaScript变量类型的有效方法吗?

时间:2014-06-06 18:56:30

标签: javascript variables types

任何编写JS的开发人员迟早都会遇到这种情况,这是一种令人愤怒的行为:

typeof []; // 'object'

虽然有instanceof之类的解决方法以及访问变量的.constructor属性,但我想到了这一点:

Array.prototype.TYPE = 'Array';
String.prototype.TYPE = 'String';
Boolean.prototype.TYPE = 'Boolean';
Object.prototype.TYPE = 'Object';
RegExp.prototype.TYPE = 'RegExp';
Number.prototype.TYPE = 'Number';

// and therefore:
[1,2,'bar', {baz: 'foo'}].TYPE === 'Array'; // true
"But life itself, my wife, and all the world / Are not with me esteemed above thy life".TYPE // 'String'
(42).TYPE === 'Number'; // true
// and so on

我知道修改原生原型通常是不受欢迎的,也就是说,这个"模式还有其他问题"?

更新: 一些评论提供了使用Object.prototype.toString等替代解决方案。这些肯定都是具有其用例的有效方法。但是,我仍然主要关注的是,是否可能存在向本机构造函数原型添加属性实际上会导致问题的情况:)

更新:

更安全的方式?

Array.prototype.getType = function() {return 'Array'};
String.prototype.getType = function() {return 'String'};
Boolean.prototype.getType = function() {return 'Boolean'};
Object.prototype.getType = function() {return 'Object'};
RegExp.prototype.getType = function() {return 'RegExp'};
Number.prototype.getType = function() {return 'Number'};

1 个答案:

答案 0 :(得分:3)

道格拉斯·克罗克福德recommends writing your own typeOf function正是出于这个原因:

  

...新的typeOf全局函数旨在替换有缺陷的typeof运算符。它产生与typeof相同的结果,除了它为'null'返回null和为数组返回'array'

他如此实施:

function typeOf(value) {
    var s = typeof value;
    if (s === 'object') {
        if (value) {
            if (typeof value.length === 'number' &&
                    !(value.propertyIsEnumerable('length')) &&
                    typeof value.splice === 'function') {              
                s = 'array';
            }
        } else {
            s = 'null';
        }
    }
    return s;
}

typeOf({}) //=> "object"

typeOf([]) //=> "array"