任何编写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'};
答案 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"