
نوشته رو در وبلاگ یاvar بخونید: yavarjs.ir/posts/typeof-null
خروجی typeof null توی جاوا اسکریپت برابر میشه با "object" که به نادرستی این معنی رو منتقل میکنه که null یک آبجکت (شیء) هست (در صورتی که نیست. null یه primitive value یا مقدار اولیه هست). این یه باگه که چون کدهای فعلی از کار میافتن نمیشه رفعش کرد.
باگ «typeof null» بازماندهی اولین نسخهی جاوااسکریپته. توی اون نسخه، مقادیر در واحدهای ۳۲بیتی ذخیره میشدن که از یک برچسب (tag) ۱ الی ۳ بیتی برای تشخیص نوع و از بقیهی بیتها برای ذخیره کردن مقدار اصلی داده استفاده میشد. «برچسبهای نوع داده» در بیتهای کمارزش ذخیره میشدن. پنجتا از این برچسبها وجود داشت:
اگه بیارزشترین بیت مقدارش 1 بود، برچسب نوع داده یک بیتی بود و اگه بیارزشترین بیت 0 بود، برچسب نوع داده ۳ بیتی بود که از دو بیت اضافهتر، برای تعیین چهار نوع داده مختلف استفاده میشد.
دو مقدار ویژه هم وجود داشتن:
undefined یا JSVAL_VOID که عدد صحیح 30^2- بود (یه عدد خارج از محدودهی اعداد صحیح).null یا JSVAL_NULL که کد ماشین اشارهگر NULL بود: یک نوع داده آبجکت که مقدار اشارهگرش 0 بود.الان دیگه باید واضح باشه که چرا typeof برای null مقدار آبجکت رو برمیگردونه: برچسبِ نوع داده رو چک میکنه و میبینه که برابر با آبجکت هست. کد اولین موتور جاوا اسکریپت برای typeof:
گامهایی که کد بالا طی میکنه:
#define JSVAL_IS_VOID(v) ((v) == JSVAL_VOID)
#define JSVAL_IS_NULL(v) ((v) == JSVAL_NULL)
این باگ شاید خیلی واضح به نظر بیاد، اما نباید فراموش کرد که برای نوشتن اولین نسخهی جاوا اسکریپت زمان خیلی کمی در اختیار بود.
منبع: The history of typeof null از وبلاگ 2ality - JavaScript and more