Bu Buradaki diğer açıklamalar sadece tamamlayıcı bilgi - ı am değil kullanımına düşündüren.constructor
her yerde.
TL; DR:typeof
Bir seçenek olmayan durumlarda ve prototip zincirini umursamadığınızı bildiğinizde , Object.prototype.constructor
aşağıdakilerden daha uygun veya daha iyi bir alternatif olabilir instanceof
:
x instanceof Y
x.constructor === Y
1.1'den beri standarttır, bu nedenle geriye dönük uyumluluk konusunda endişelenmeyin.
Muhammed Umer burada da bir yorumda kısaca bahsetti. Bir prototip ile her şey üzerinde çalışır - yani her şey değil null
veya undefined
:
// (null).constructor; // TypeError: null has no properties
// (undefined).constructor; // TypeError: undefined has no properties
(1).constructor; // function Number
''.constructor; // function String
([]).constructor; // function Array
(new Uint8Array(0)).constructor; // function Uint8Array
false.constructor; // function Boolean()
true.constructor; // function Boolean()
(Symbol('foo')).constructor; // function Symbol()
// Symbols work, just remember that this is not an actual constructor:
// new Symbol('foo'); //TypeError: Symbol is not a constructor
Array.prototype === window.frames.Array; // false
Array.constructor === window.frames.Array.constructor; // true
Ayrıca, kullanım durumunuza bağlı olarak çok daha hızlı olabilir instanceof
(bunun nedeni muhtemelen tüm prototip zincirini kontrol etmek zorunda olmamasıdır). Benim durumumda bir değerin yazılan bir dizi olup olmadığını kontrol etmek için hızlı bir yol gerekli:
function isTypedArrayConstructor(obj) {
switch (obj && obj.constructor){
case Uint8Array:
case Float32Array:
case Uint16Array:
case Uint32Array:
case Int32Array:
case Float64Array:
case Int8Array:
case Uint8ClampedArray:
case Int16Array:
return true;
default:
return false;
}
}
function isTypedArrayInstanceOf(obj) {
return obj instanceof Uint8Array ||
obj instanceof Float32Array ||
obj instanceof Uint16Array ||
obj instanceof Uint32Array ||
obj instanceof Int32Array ||
obj instanceof Float64Array ||
obj instanceof Int8Array ||
obj instanceof Uint8ClampedArray ||
obj instanceof Int16Array;
}
https://run.perf.zone/view/isTypedArray-constructor-vs-instanceof-1519140393812
Ve sonuçlar:
Chrome 64.0.3282.167 (64 bit, Windows)
Firefox 59.0b10 (64 bit, Windows)
Merakla, hızlı bir oyuncak kıyaslama yaptım typeof
; şaşırtıcı bir şekilde daha kötü performans göstermiyor ve Chrome'da biraz daha hızlı görünüyor:
let s = 0,
n = 0;
function typeofSwitch(t) {
switch (typeof t) {
case "string":
return ++s;
case "number":
return ++n;
default:
return 0;
}
}
// note: no test for null or undefined here
function constructorSwitch(t) {
switch (t.constructor) {
case String:
return ++s;
case Number:
return ++n;
default:
return 0;
}
}
let vals = [];
for (let i = 0; i < 1000000; i++) {
vals.push(Math.random() <= 0.5 ? 0 : 'A');
}
https://run.perf.zone/view/typeof-vs-constructor-string-or-number-1519142623570
NOT: İşlevlerin listelenme sırası görüntüler arasında geçiş yapar!
Chrome 64.0.3282.167 (64 bit, Windows)
Firefox 59.0b10 (64 bit, Windows)
NOT: İşlevlerin listelenme sırası görüntüler arasında geçiş yapar!