这是我脑海中的缺点列表:
1) 浏览器支持。
Felix Kling 的回答涵盖了这一点,非 IE 效果很好。 IE - 不是那么多,虽然我认为解决方法是可能的。
2) 自定义构造函数
var Foo = function(){};
var foo = new Foo();
console.log(foo.constructor.name); // empty string
当然,这可以通过强制执行一种不允许构造函数是匿名函数的风格来缓解,或者发明一种疯狂的解决方法。
var Foo = function Foo(){};
function Bar(){};
var Baz = function (){};
Baz.name = 'Baz';
3) 例外情况
typeof 不会抛出异常。因此,它用于检查是否尚未定义变量:
if (typeof baz === 'undefined') console.log('baz not defined');
if (baz === undefined) console.log('Reference error instead!');
更糟糕的是,检查 constructor.name 会为 null 和 undefined 值抛出 TypeError。这可能可以通过使用来缓解:
foo != null && foo.constructor.name
4) 包装对象。
在某些极端情况下 typeof 和 item.constructor.name 返回冲突的结果:
var foo = false;
var bar = new Boolean(false);
console.log(typeof foo); // boolean
console.log(typeof bar); // object
console.log(foo.constructor.name); // Boolean
console.log(bar.constructor.name); // Boolean
if (foo) console.log('No');
if (bar) console.log('Yes');
在少数情况下这些实际上很重要,以上几乎是最坏的情况。
5) 速度
我希望本地运算符比 2 次属性检查快得多,但如果这个想法得到关注,它也可能会得到更好的优化。无论哪种方式,我都无法想象这会成为您的应用程序的瓶颈。
总而言之,有很多缺点,我想不出使用它的充分理由。