এটি এখানে অন্যান্য সমস্ত ব্যাখ্যাগুলির পরিপূরক জ্ঞান - আমি সর্বত্র ব্যবহার করার পরামর্শ দিচ্ছি না.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 (-৪-বিট, উইন্ডোজ)
ফায়ারফক্স 59.0b10 (-৪-বিট, উইন্ডোজ)
কৌতূহলের বাইরে, আমি এর বিরুদ্ধে একটি দ্রুত খেলনা বেঞ্চমার্ক করেছি 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 (-৪-বিট, উইন্ডোজ)
ফায়ারফক্স 59.0b10 (-৪-বিট, উইন্ডোজ)
দ্রষ্টব্য: ক্রমে ইমেজগুলির মধ্যে স্যুইচগুলি তালিকাভুক্ত করা হয়েছে!