我已經看到了這個講了很多最近,即使在編譯爲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個屬性檢查快得多,但如果這個想法得到牽引它可能會得到更好的優化,以及。無論哪種方式,我無法想象這永遠是你的應用程序的瓶頸。
總而言之,有不少缺點,我想不出一個強有力的理由來使用它。