यह यहाँ अन्य सभी स्पष्टीकरणों के लिए सिर्फ पूरक ज्ञान है - मैं हर जगह उपयोग करने का सुझाव नहीं दे रहा हूं .constructor
।
टीएल; डीआर: उन स्थितियों में जहां typeof
एक विकल्प नहीं है, और जब आप जानते हैं कि आप प्रोटोटाइप श्रृंखला के बारे में परवाह नहीं करते हैं , Object.prototype.constructor
तो एक व्यवहार्य या इससे भी बेहतर विकल्प हो सकता है instanceof
:
x instanceof Y
x.constructor === Y
यह 1.1 से मानक में है, इसलिए पीछे की संगतता के बारे में कोई चिंता नहीं है।
मुहम्मद उमर ने कुछ समय पहले यहां एक टिप्पणी में इसका उल्लेख किया था। यह एक प्रोटोटाइप के साथ सब कुछ पर काम करता है - इसलिए सब कुछ null
या नहीं 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
इसके अलावा, आपके उपयोग के मामले पर निर्भर करता है कि यह बहुत तेजी से हो सकता है instanceof
(कारण यह है कि यह पूरी प्रोटोटाइप श्रृंखला की जांच नहीं करता है)। मेरे मामले में मुझे यह जांचने के लिए तेज़ तरीका चाहिए था कि क्या कोई मान टाइप किया गया है:
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
और परिणाम:
Chrome 64.0.3282.167 (64-बिट, विंडोज)
फ़ायरफ़ॉक्स 59.0b10 (64-बिट, विंडोज)
जिज्ञासा से बाहर, मैंने एक त्वरित खिलौना बेंचमार्क के खिलाफ किया typeof
; आश्चर्यजनक रूप से यह बहुत बुरा प्रदर्शन नहीं करता है, और यह क्रोम में थोड़ा तेज लगता है:
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
नोट: आदेश जिसमें कार्य छवियों के बीच सूचीबद्ध स्विच हैं!
Chrome 64.0.3282.167 (64-बिट, विंडोज)
फ़ायरफ़ॉक्स 59.0b10 (64-बिट, विंडोज)
नोट: आदेश जिसमें कार्य छवियों के बीच सूचीबद्ध स्विच हैं!