我对内置的typeof
方法感到有点沮丧,因为它没有很好地处理它的工作。向对象原型添加一个类型属性是一个坏主意,(如果是)为什么会这样?
Array.prototype.type = "Array";
Object.prototype.type = "Object";
Function.prototype.type = "Function";
String.prototype.type = "String";
Number.prototype.type = "Number";
function typeOf(obj) {
if (!obj) return obj; // Returns undefined and null values.
return obj.type;
}
答案 0 :(得分:1)
你可以做这样的事情
function typeOf(inputArg) {
if (!arguments.length) {
throw new SyntaxError();
}
if (typeof inputArg === 'undefined') {
return 'undefined';
}
if (inputArg === null) {
return 'null';
}
return ({}.toString.call(inputArg).match(/\[object (Number|Boolean|String|Array|Object|Function)\]/) || ['Object']).pop().toLowerCase();
}
console.log(typeOf(undefined));
console.log(typeOf(null));
console.log(typeOf(1));
console.log(typeOf(true));
console.log(typeOf(''));
console.log(typeOf([]));
console.log(typeOf({}));
console.log(typeOf(function () {}));
console.log(typeOf(/a/));
console.log(typeOf());
输出
undefined null number boolean string array object function object Uncaught SyntaxError上
但是,旧浏览器中还存在一些其他错误,这些错误仍会导致不同的结果。这并没有考虑E4X XML
内容,或者ECMA next
中可能定义的任何新类型(尽管可能没什么新内容)。您还需要注意,这将识别原始对象,即new String('hello')
为string
而不是object
,这可能不是您想要的。因此,您需要仔细考虑您的需求或您想要实现的目标(我并不完全清楚)。
答案 1 :(得分:1)
如果你只是想找一种方法来测试类型&ludash' (可能'下划线')带来的功能可能会更符合您的喜好:
http://lodash.com/docs#isArray (以及所有其他_.is *函数)