pazirehsarafraz
pazirehsarafraz
خواندن ۲ دقیقه·۶ سال پیش

66 - جاوااسکریپت: typeof, instanceof

دیدیم که js یک زبان dynamic typing است، که به ما اجازه میدهد کارهای جالب و گاهی خطرناک انجام دهیم. اگر یک متغیر داشته باشیم و بخواهیم بدانیم نوع آن چیست چه کنیم؟ عملگر typeof به ما میگوید که متغیر از چه نوعی است.

var a = 3;

console.log(typeof a);

خروجی این کد number است. حرف اول number کوچک است. چون از function constructor استفاده نکرده ایم (بهتر است استفاده نکنیم).

var b = 'Hello';

console.log(typeof b);

خروجی کد بالا string است.

var c = { };

console.log(typeof c);

خروجی کد بالا object است که با حرف کوچک شروع میشود. این خروجی فقط یک رشته است.

var d = [ ];

console.log(typeof d);

console.log(Object.prototype.toString.call(d));

همان طور که میدانیم آرایه ها شیء هستند. بنابراین خروجی typeof آن برابر با object است. این خروجی خیلی به درد نمیخورد. برای این مسئله چند راه حل وجود دارد. یکی از این راه حل ها استفاده از مفهوم prototype و مفهوم call است. اگر از کد:

console.log(d.toString());

استفاده کنیم، خروجی یک رشته خالی است. در کنسول هیچی نمیبینیم، یک رشته خالی است. چون سعی کرده که متن داخل آرایه را بگیرد و به رشته تبدیل کند. در شیء پایه Object یک ویژگی toString در prototype ش وجود دارد. به جای اینکه با Object.prototype.toString کار کنیم از call استفاده میکنیم تا تابع را فراخوانی کند و به آن بگوید که متغیر this به کجا اشاره میکند. چون toString از متغیر this استفاده میکنید تا خروجی خود را تولید کند. با چنین کدی خروجی [object Array] خواهد بود.

function Person(name) { this.name = name; }

var e = new Person('Jane');

console.log(typeof e);

اینجا یک function constructor داریم که با حرف بزرگ شروع شده و چیزی return نمیکند. خروجی کد بالا هم object است.

console.log(e instanceof Person);

کلمه کلیدی instanceof به ما میگوید که آیا شیء در prototype chain هست یا نه. پس خروجی کد بالا true است.

.console.log(typeof undefined);

خروجی کد بالا undefined است.

console.log(typeof null);

خروجی کد بالا object است که یک باگ در js است. چون کدها و کتابخانه های زیادی بر این اساس نوشته شده است هیچ وقت این باگ را درست نکردند. حل این باگ خیلی زمانبر خواهد بود.پس عملگر typeof یک پارامتر را میگیرد. یک تابع است و یک رشته برمیگرداند. instanceof موقع کار کردن با object chain به کار میرود. بررسی میکند که آیا شیء در prototype chain شیئی هست یا نه.

var z = function() { };console.log(typeof z);

خروجی این کد function است. تابع ها در js شیء هستند. پس به علت first class function متغیر z یک شیء است.

شاید از این پست‌ها خوشتان بیاید