我已经看到了这个讲了很多最近,即使在编译为JavaScript,他们已经取代typeof
与item.constructor.name
使用构造函数名称作为类型的可靠程度如何?
如何可靠的是这并没有任何优点(除了阵列型的)新的编程语言 and cons?
这里有一个例子
var tmp = [];
typeof tmp // object
tmp.constructor.name // Array
我已经看到了这个讲了很多最近,即使在编译为JavaScript,他们已经取代typeof
与item.constructor.name
使用构造函数名称作为类型的可靠程度如何?
如何可靠的是这并没有任何优点(除了阵列型的)新的编程语言 and cons?
这里有一个例子
var tmp = [];
typeof tmp // object
tmp.constructor.name // Array
name
作为函数的性质是和即将到来的ES6标准的一部分,目前supported by all browsers expect IE。除此之外,使用内置对象应该没问题。
由用户定义的构造函数创建的对象OTOH可能没有正确的constructor
属性集,例如,在使用继承但constructor
值未设置回到构造函数的情况:
Child.prototype = Object.create(Parent.prototype);
// Child.prototype.constructor = Child;
TL;博士:
内置对象和非IE浏览器:可靠
第三方用户定义的构造函数或IE:不可靠
这里是利弊把我的头顶部的列表:
1)浏览器支持。
菲利克斯克林的答案覆盖了它,非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值的类型错误。这大概可以通过使用:
foo != null && foo.constructor.name
4)包装对象。
有一些边缘情况下typeof和item.constructor。名称返回冲突的结果:
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个属性检查快得多,但如果这个想法得到牵引它可能会得到更好的优化,以及。无论哪种方式,我无法想象这永远是你的应用程序的瓶颈。
总而言之,有不少缺点,我想不出一个强有力的理由来使用它。