جاوا اسکریپت، نوع، انواع و کلاس ها. خطاهای شناسایی نوع دینامیکی مرتبط با مناطق مرده موقت

شناسایی نوع پویا

شناسایی نوع پویا (RTTI)به شما امکان می دهد نوع یک شی را در زمان اجرا تعیین کنید. معلوم می شود که به دلایل مختلفی مفید است. به طور خاص، با ارجاع به کلاس پایه، می توانید نوع شی قابل دسترسی با این مرجع را کاملاً دقیق تعیین کنید. شناسایی نوع پویا همچنین به شما امکان می دهد از قبل بررسی کنید که نتیجه ریخته گری نوع چقدر موفقیت آمیز خواهد بود و از استثناء به دلیل ریخته گری نوع نادرست جلوگیری می کند. علاوه بر این، شناسایی نوع پویا جزء اصلی بازتاب است.

برای پشتیبانی از شناسایی نوع پویا، سی شارپ سه مورد را ارائه می دهد کلید واژه هاالف: است، به عنوان و نوع. هر یک از این کلمات کلیدی به نوبه خود بیشتر مورد بحث قرار می گیرند.

اپراتور است

نوع خاص یک شی را می توان با استفاده از عملگر is تعیین کرد. شکل کلی آن در زیر آمده است:

بیان نوع است

که در آن عبارت بیانگر یک عبارت واحد است که شیئی که نوع آن در حال آزمایش است را توصیف می کند. اگر عبارت از نوع سازگار یا یکسان با نوع مورد آزمایش باشد، نتیجه این عملیات درست است، در غیر این صورت نادرست است. بنابراین، اگر عبارت از نوعی باشد که در یک شکل آزمایش می شود، نتیجه درست خواهد بود. در عملگر is، هر دو نوع اگر یک نوع باشند یا اگر تبدیل مرجع، باکس یا جعبه گشایی ارائه شده باشد، به عنوان سازگار تعریف می شوند.

مثال زیر برای استفاده از عملگر is است:

استفاده از سیستم؛ فضای نام ConsoleApplication1 ( class Add ( ) class Sum: Add ( ) class Program ( static void Main() ( Add a = new Add(); Sum s = new Sum(); if (a Add is) Console.WriteLine("Variable a از نوع Add است")؛ if (s Sum است) Console.WriteLine("نوع متغیر s از کلاس Add به ارث رسیده است")؛ Console.ReadLine(); ) ) )

به عنوان اپراتور

گاهی اوقات یک تبدیل نوع باید در زمان اجرا انجام شود، اما در صورت عدم موفقیت تبدیل، استثناء ایجاد نشود، که با یک نوع ریختگی کاملاً ممکن است. عملگر as به این منظور عمل می کند و شکل کلی زیر را دارد:

بیان به عنوان نوع

که در آن عبارت بیانگر یک عبارت واحد است که قابل تبدیل به نوع مشخص شده است.

اگر نتیجه چنین تبدیلی موفقیت آمیز باشد، یک مرجع به نوع برگردانده می شود، در غیر این صورت، یک مرجع صفر. عملگر as فقط می تواند برای تبدیل مرجع، هویت، جعبه کردن، جعبه گشایی استفاده شود. در برخی موارد، عملگر as می تواند جایگزین مناسبی برای عملگر is باشد. به عنوان مثال، برنامه زیر را در نظر بگیرید:

استفاده از سیستم؛ فضای نام ConsoleApplication1 ( کلاس Add ( ) class Sum: Add ( ) class Program ( static void Main() ( Add a = new Add(); Sum s = new Sum(); // اجرای cast a = s به عنوان Add؛ if ( a != null) Console.WriteLine ("تبدیل با موفقیت انجام شد")؛ در غیر این صورت Console.WriteLine ("خطا در هنگام تبدیل")؛ Console.ReadLine(); ) ) )

نتیجه اجرای این برنامه یک تبدیل موفق خواهد بود.

جاوا اسکریپتیا JS(به طور خلاصه) زبان آسانی نیست و توسعه دهندگان تازه کار فوراً در مورد آن یاد نخواهند گرفت. در ابتدا آنها اصول اولیه را یاد می گیرند و همه چیز رنگارنگ و زیبا به نظر می رسد. کمی عمیق تر، وجود دارد آرایه های جاوا اسکریپت، اشیاء، تماس های تلفنی و هر چیز دیگری که اغلب ذهن را منفجر می کند.

در جاوا اسکریپت، مهم است که نوع یک متغیر را به درستی بررسی کنید. فرض کنید می خواهید بدانید که آیا متغیر آرایهیا یک شی؟ چگونه آن را به درستی بررسی کنیم؟ در این مورد خاص، ترفندهایی در حین تأیید وجود دارد و این همان چیزی است که این پست در مورد آن خواهد بود. بیایید بلافاصله شروع کنیم.

بررسی نوع متغیر

به عنوان مثال، باید بررسی کنید که آیا یک متغیر یک شی، یک آرایه، یک رشته یا یک عدد است. می‌توانید از typeof برای این کار استفاده کنید، اما همیشه حقیقت را به شما نمی‌گوید، و من دلیل آن را در مثال زیر به شما نشان خواهم داد.

من این مثال را نوشتم تا نشان دهم که چرا typeof همیشه انتخاب درستی نیست.

Var _comparison = ( string: "string", int: 99, float: 13.555, object: (hello: "hello"), array: new Array(1, 2, 3) ); // آرایه ای را با کلیدهای شی برمی گرداند var _objKeys = Object. keys(_comparison); for(var i = 0; i<= _objKeys.length - 1; i++) { // выведем в консоль тип каждой переменной console.log(typeof _comparson[_objKeys[i]]); }

نتیجه اجرای کد:

شیء شیء شماره رشته

درست؟ - البته که نه. دو مشکل وجود دارد. هر یک از آنها به تفصیل شرح داده می شود و راه حلی پیشنهاد می شود.

مشکل اول: عدد شناور، خروجی به عنوان عدد

Comparison.float یک عدد نیست و باید به جای عدد یک float باشد برای رفع این مشکل می توانید یک تابع با چکی مانند کد زیر ایجاد کنید.

Var_floatNumber = 9.22; var_notFloatNumber = 9; console.log(isFloat(_floatNumber)); console.log(isFloat(_notFloatNumber)); console.log(isFloat("")); تابع isFloat(n)( برگرداندن عدد(n) === n && n % 1 !== 0; )

تابع isFloat() تمام مقادیر اعداد ممیز شناور را بررسی می کند. ابتدا بررسی کنید که آیا متغیر برابر است یا خیر nعدد (Number(n) === n) و اگر بله، یک بررسی دیگر برای تقسیم با باقی مانده انجام می شود و اگر باقی مانده بود، یک Boolean برمی گردد ( درست است، واقعییا نادرست) نتیجه (n % 1 !== 0).

در مثال بالا باز می گردد درست است، واقعی, نادرستو نادرست. معنای اول این است شناورنوع دوم نیست - این یک عدد منظم است و آخرین فقط یک رشته خالی است که با قوانین مطابقت ندارد.

مشکل دوم: آرایه به عنوان یک شی تعریف شد

در همان مثال اول، آرایه به صورت یک شی رندر می شود که خیلی خوب نیست، زیرا گاهی اوقات لازم است از این نوع استفاده کنید نه چیز دیگری.

روش های مختلفی برای آزمایش یک متغیر برای نوع آرایه وجود دارد.

گزینه اول (گزینه خوب). بررسی کنید که آیا داده ها متعلق به یک آرایه با استفاده از () instanceof هستند.

Var data = New Array("Hello", "World"); var isArr = نمونه داده آرایه.

گزینه دوم (گزینه خوب). متد ()Array.isArray یک مقدار بولی را برمی‌گرداند که به آرایه بودن یا نبودن متغیر بستگی دارد.

Var data = New Array("Hello", "World"); var isArr = Array.isArray(data);

گزینه سوم (بهترین، اما طولانی). برای راحتی، می توانید این روش را به یک تابع تبدیل کنید. با استفاده از Object ما می سازیم. اگر نتیجه Object.prototype.toString.call(data) برابر نباشد، آن متغیر یک آرایه () نیست.

Var data = New Array("Hello", "World"); var isArr = Object.prototype.toString.call(data) == ""; console.log(isArr);

آخرین نتیجه به عنوان یک تابع راحتی:

تابع isArray(data) ( Object.prototype.toString.call(data) == "" )

حالا می توانید توابع ()isArray را فراخوانی کنید و یک آرایه یا چیزی را به عنوان آرگومان تنظیم کنید و نتیجه را ببینید.

پس گفتار

رکورد بسیار بزرگ از آنچه در ابتدا در نظر گرفته شده بود بود. اما من از آن راضی هستم زیرا به اندازه کافی مختصر و واضح است که مشکلات اعتبارسنجی متغیرها در جاوا اسکریپت و نحوه دور زدن آنها را توضیح دهد.

اگر سوالی دارید لطفا زیر همین پست مطرح کنید. من خوشحال خواهم شد کمک کنم.

a = (b > 0) && (c + 1 != d); پرچم = !(وضعیت = 0);

جدول 14.5. عملگرهای منطقی

توضیحات اپراتور

! نه (وارونگی منطقی)

&& AND (ضرب بولی)

|| OR (اضافه منطقی)

جدول 14.6. نتایج اجرای عملگرهای AND و OR

عملوند 1

عملوند 2

جدول 14.7. نتایج اجرای دستور NOT

دریافت نوع اپراتور

دریافت اپراتور نوع typeof رشته ای را برمی گرداند که نوع داده عملوند را توصیف می کند. عملوندی که نوع آن پیدا می شود بعد از این عملگر قرار می گیرد و در داخل پرانتز قرار می گیرد:

s = typeof("str");

در نتیجه این عبارت، متغیر s حاوی رشته "string" خواهد بود که نوع رشته را نشان می دهد.

تمام مقادیری که نوع عملگر می تواند برگرداند در جدول 1 فهرست شده است. 14.8.

جدول 14.8. مقادیر برگردانده شده توسط نوع اپراتور

نوع داده

رشته برگشتی

رشته

عددی

جدول 14.8 (پایان)

نوع داده

رشته برگشتی

منطقی

سازگاری و تبدیل نوع داده

وقت آن است که دو موضوع مهم دیگر را در نظر بگیریم: سازگاری نوع داده و تبدیل از یک نوع به نوع دیگر.

وقتی دو عدد را با هم جمع می کنید چه اتفاقی می افتد؟ درست است - یک مقدار عددی دیگر. اگر یک عدد و یک رشته اضافه کنید چه؟ گفتنش سخت است... در اینجا جاوا اسکریپت با مشکل ناسازگاری نوع داده مواجه می شود و سعی می کند با تبدیل یکی از آنها به دیگری، این انواع را سازگار کند. ابتدا سعی می کند رشته را به عدد تبدیل کند و اگر موفق شد جمع را انجام می دهد. در صورت عدم موفقیت، عدد به یک رشته تبدیل می شود و دو رشته حاصل به هم متصل می شوند. به عنوان مثال، اسکریپت وب در فهرست 14-6، مقدار متغیر b را هنگامی که به متغیر a اضافه می شود، به یک نوع عددی تبدیل می کند. بنابراین متغیر c حاوی مقدار 23 خواهد بود.

لیست 14.6

var a, b, c, d, e, f; a = 11;

b = "12"; c = a + b;

d = "جاوا اسکریپت"; e = 2;

اما از آنجایی که مقدار متغیر d را نمی توان به عدد تبدیل کرد، مقدار e به یک رشته تبدیل می شود و نتیجه - مقدار f - برابر می شود.

مقادیر بولی در صورت لزوم به مقادیر عددی یا رشته ای تبدیل می شوند. True به عدد 1 یا رشته "1" و false به 0 یا "0" تبدیل می شود. برعکس، عدد 1 به true و عدد 0 به false تبدیل می شود. همچنین false تبدیل می شود

ما پوچ و تعریف نشده هستیم.

قسمت سوم. رفتار صفحه وب اسکریپت های وب

می توان مشاهده کرد که جاوا اسکریپت برای اجرای صحیح عبارات نوشته شده نادرست نیز تلاش می کند. گاهی اوقات کار می‌کند، اما بیشتر اوقات، همه چیز طبق برنامه پیش نمی‌رود، و در نهایت اسکریپت وب لغو می‌شود، زیرا یک خطا در جای کاملاً متفاوتی از اسکریپت، در عبارت کاملاً صحیح پیدا می‌شود. بنابراین بهتر است از چنین حوادثی جلوگیری شود.

تقدم اپراتور

آخرین مسئله ای که در اینجا به آن خواهیم پرداخت اولویت عملگر است. همانطور که به یاد داریم، اولویت بر ترتیب اجرای عملگرها در یک عبارت تأثیر می گذارد.

بگذارید عبارت زیر وجود داشته باشد:

در این حالت ابتدا مقدار c به مقدار متغیر b اضافه می شود و سپس 10 از مجموع کم می شود.عملگرهای این عبارت دارای اولویت یکسانی هستند و بنابراین به شدت از چپ به راست اجرا می شوند.

حال این عبارت را در نظر بگیرید:

در اینجا ابتدا مقدار c در 10 ضرب می شود و تنها پس از آن مقدار b به حاصل ضرب اضافه می شود. عملگر ضرب اولویت بیشتری نسبت به عملگر جمع دارد، بنابراین ترتیب "به شدت از چپ به راست" نقض می شود.

اپراتورهای انتساب کمترین اولویت را دارند. به همین دلیل است که ابتدا خود عبارت مورد ارزیابی قرار می گیرد و سپس نتیجه آن به یک متغیر اختصاص می یابد.

که در به طور کلی، اصل اساسی اجرای تمام دستورات به شرح زیر است: اول، دستورات با بیش از اولویت بالاو تنها پس از آن - اپراتورهایی با یک پایین تر. عملگرهایی با اولویت یکسان به ترتیبی که ظاهر می شوند (از چپ به راست) اجرا می شوند.

که در زبانه 14.9 تمام عملگرهایی را که مطالعه کرده‌ایم به ترتیب تقدم نزولی فهرست می‌کند.

جدول 14.9. اولویت اپراتور (به ترتیب نزولی)

اپراتورها

شرح

++ -- - ~ ! نوعی از

افزایش، کاهش، تغییر علامت، منطقی NOT، استنتاج نوع

ضرب، تقسیم، باقیمانده

جمع و الحاق رشته، تفریق

اپراتورهای مقایسه

منطقی و

فصل 14. مقدمه ای بر برنامه نویسی وب. زبان جاوا اسکریپت

جدول 14.9 (پایان)

اپراتورها

شرح

منطقی OR

عملگر مشروط (به زیر مراجعه کنید)

= <оператор>=

تکلیف، ساده و پیچیده

توجه!

این جدول را به خاطر بسپارید. ترتیب نادرست اجرای دستورات می تواند باعث ایجاد خطاهایی شود که به سختی قابل تشخیص هستند، که در آنها یک عبارت ظاهراً کاملاً صحیح نتیجه نادرستی می دهد.

اما اگر لازم باشد ترتیب اجرای عادی دستورات را بشکنیم چه؟ بیایید از براکت استفاده کنیم. در این نماد، ابتدا دستورات داخل پرانتز اجرا می شوند:

a = (b + c) * 10;

در اینجا ابتدا مقادیر متغیرهای b و c اضافه می شود و سپس مجموع حاصل در 10 ضرب می شود.

اپراتورهای داخل پرانتز نیز دارای اولویت هستند. بنابراین، اغلب از پرانتزهای تو در تو استفاده می شود:

a = ((b + c) * 10 - d) / 2 + 9;

در اینجا دستورات به ترتیب زیر اجرا می شوند:

1. b و c را اضافه کنید.

2. مقدار حاصل را در 10 ضرب کنید.

3. کم کردن d از حاصل ضرب.

4. اختلاف را بر 2 تقسیم کنید.

5. جمع 9 به ضریب.

اگر براکت ها را بردارید:

a = b + c * 10 - d / 2 + 9;

سپس ترتیب اجرای عملگرها به صورت زیر خواهد بود:

1. c و 10 را ضرب کنید.

2. d را بر 2 تقسیم کنید.

3. جمع b و ضرب c و 10.

4. تفریق حاصل از حاصل حاصل از حاصل از تقسیم d تا 2.

5. 9 را به اختلاف حاصل اضافه کنید.

نتیجه کاملاً متفاوتی به نظر می رسد، درست است؟

  • تعریف نشده: «تعریف نشده»
  • تهی: "شیء"
  • بولی: "بولی"
  • شماره: "تعداد"
  • رشته: "رشته"
  • تابع: "عملکرد"
  • همه چیز دیگر: "شیء"

نکات زیر باید به این جدول اضافه شود:

1. typeof null === "object" .

از لحاظ نظری، یک نکته ظریف در اینجا وجود دارد. در زبان هایی که به صورت ایستا تایپ می شوند، متغیر نوع شی ممکن است حاوی یک شی نباشد (اشاره گر NULL، nil، null).

عملا - در جاوا اسکریپت ناخوشایند است. بنابراین توسعه دهندگان ES 5.1 می خواهند کار شهودی تری انجام دهند: typeof null === "null".

اما از آنجایی که ما هنوز در اطراف ES3 هستیم، برای مثال در این مورد اشتباه نکنید:

/* تابع برخی از شی‌ها را جستجو می‌کند و اگر چیزی پیدا نشد آن را باطل می‌کند */ function search() () var obj = search(); if (نوع obj === "object") ( // آیا ما واقعاً شی (FAIL) obj.method();

2. اشیاء wrapper را فراموش نکنید (نوع شماره جدید (5) === "ابجکت").

3. و حق مرورگرها برای انجام هر کاری با آبجکت هاست را فراموش نکنید.

تعجب نکنید که Safari سرسختانه با HTMLCollection به عنوان یک نوع تابع برخورد می کند و IE قبل از نهم تابع ()alert مورد علاقه ما را به عنوان یک شی نگه می دارد. همچنین کروم قبلا RegExp را یک تابع در نظر می گرفت، اما اکنون به نظر می رسد که به خود آمده و با یک شی به آن پاسخ می دهد.

toString()

تلاش برای کشف نوع یک مقدار از نتیجه متد toString() بی معنی است. در تمام «کلاس‌ها» این روش برای خودش بازتعریف می‌شود.

این روش برای نمایش اطلاعات اشکال زدایی خوب است، اما نوع متغیر را نمی توان از روی آن تعیین کرد.

Object.prototype.toString()

حتی با وجود اینکه toString در "کلاس‌های" بتن نادیده گرفته شده است، ما هنوز اجرای اصلی آن را از Object داریم. بیایید سعی کنیم از آن استفاده کنیم:

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

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


کلینتون این بار را کم می کند

به اندازه کافی عجیب، این روش به طرز شگفت آوری خوب عمل می کند.

برای انواع اسکالربرمی گرداند , , , .

نکته خنده دار این است که حتی شماره (5) جدید که نوع شکست در اینجا برمی گردد.

در حالت null و undefined متد با شکست مواجه خواهد شد. مرورگرهای مختلف یا مورد انتظار و , یا , یا حتی . با این حال، تعیین نوع این دو مقدار بدون آن آسان است.

چیزهای جالب زمانی شروع می شوند که به اشیا (آنهایی که typeof === "ابجکت" دارند) می رسیم.

اشیاء داخلی، عملاً با یک انفجار کار می کنند:

  • {} —
  • تاریخ-
  • خطا-
  • regexp-

تنها چیزی که از لیست آرگومان ها خارج می شود، یا، یا است.
با میزبان-اشیاء، همه چیز دوباره بدتر است.

در اینترنت اکسپلورر، اشیاء DOM فقط از نسخه 8 شروع به تبدیل شدن به اشیاء "عادی" کردند، و سپس نه کاملاً تا انتها. بنابراین، در IE 6-8 همه این اشیاء (HTMLCOllection، DOMElement، TextNode، و همچنین سند و پنجره) به سادگی به cast می‌شوند.

در همه مرورگرهای دیگر (از جمله IE9)، شما می توانید کاری را با نتیجه toString انجام دهید. اگرچه همه چیز نیز آسان نیست: HTMLCollection وجود دارد، سپس . پنجره - سپس، سپس، سپس. اما شما می توانید از قبل تلاش کنید تا چیزی از این موضوع به دست آورید.

این کار با DOMElement دشوارتر است: با فرمت متفاوت برای هر تگ نمایش داده می شود. اما اینجا فصل عادی به ما کمک خواهد کرد.

در مورد سایر آبجکت های میزبان (در تست های مکان و ناوبر)، داستان تقریباً مشابه است. در همه جا به جز IE، آنها را می توان با یک رشته شناسایی کرد.

از معایب استفاده از Object.prototype.toString():

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

2. تعیین نوع با تجزیه رشته ای که با روشی که اصلاً برای تعیین نوع نیست برگردانده می شود و حتی روی شیئی که بر آن صدق نمی کند فراخوانی می شود، مقداری رسوب بر روح می گذارد.

3. در اینترنت اکسپلورر قدیمی، همانطور که می بینید، آبجکت های میزبان معمولاً شناسایی نمی شوند.

با این حال، هنگامی که در کنار ابزارهای دیگر استفاده می شود، کاملاً کارآمد است.


سازندگان

و در نهایت سازندگان. چه کسی بهتر از سازنده آن در مورد "کلاس" یک شی در JS صحبت می کند؟

null و undefined نه آبجکت های wrapper دارند و نه سازنده.

بقیه انواع اسکالر دارای لفاف هستند، بنابراین می توانید یک سازنده دریافت کنید:

(5) .constructor === شماره ; (شماره .NaN ) .constructor === شماره ; (درست ) .constructor === Boolean ; ("رشته") .constructor === رشته ;

(5). سازنده === تعداد; (Number.NaN).constructor === تعداد; (true).constructor === Boolean; ("string").constructor === رشته;

اما instanceof در اینجا کار نخواهد کرد:

5 نمونه از تعداد ; // false Number .NaN instanceof Number ; // false true instance of Boolean ; // false "string" instanceof String ; // نادرست

5 instanceofNumber; // false Number.NaN instanceof Number; // false true instance of Boolean; // false "string" instanceof String; // نادرست

(مثلاً برای شماره جدید (5) با رنج طولانی کار خواهد کرد)

با توابع (که اشیاء نیز هستند)، instanceof انجام می دهد:

کنسول ( ( تابع ( ) ( ) ) instanceof Function ) ; // کنسول واقعی log ( (تابع () ( ) ) .constructor === تابع ) ; // درست است، واقعی

console.log((function () ()) instanceof Function); // true console.log((function () ()).constructor === Function); // درست است، واقعی

تمام اشیاء کلاس های داخلی نیز به راحتی توسط سازنده ها شناسایی می شوند: Array، Date، RegExp، Error.

یک مشکل در اینجا با آرگومان هایی پیش می آید که سازنده آنها Object است.

و دومی با خود شیء، یا بهتر است بگوییم، نحوه ارجاع شیء ایجاد شده از طریق سازنده سفارشی به آن.

فقط شی پایه را می توان به صورت زیر تعریف کرد:

Obj instanceofObject;

به‌عنوان یکی از گزینه‌های تعریف، روی همه انواع ممکن دیگر (آرایه، خطا...) تکرار کنید و اگر هیچ‌کدام از آنها در زیر قرار نگرفت - "object".

سازنده ها و اشیاء میزبان

اوضاع با اشیاء میزبان بدتر می شود.

بیایید با این واقعیت شروع کنیم که اینترنت اکسپلورر تا نسخه 7 شامل آنها را به هیچ وجه به عنوان اشیاء عادی در نظر نمی گیرد. آنها به سادگی سازنده و نمونه اولیه در آنجا ندارند (در هر صورت برنامه نویس نمی تواند به آنها دسترسی پیدا کند).

در مرورگرهای دیگر اوضاع بهتر است. سازنده وجود دارد و می توانید کلاس ارزش را از روی آنها تعیین کنید. فقط آنها در مرورگرهای مختلف متفاوت خوانده می شوند. به عنوان مثال، برای یک HTMLCollection سازنده یا یک HTMLCollection یا یک NodeList یا حتی یک NodeListConstructor خواهد بود.

همچنین باید یک سازنده پایه برای DOMElement تعریف کنید. در FF، برای مثال، HTMLElement است که HTMLDivElement و سایرین قبلاً از آن به ارث می برند.

این ترفند توسط فایرفاکس در زیر نسخه 10 و اپرا در نسخه 11 ارائه شده است. در آنجا سازنده مجموعه Object است.

سازنده.نام

سازنده ها همچنین دارای یک ویژگی نام هستند که می تواند مفید باشد.

این شامل نام تابع سازنده است، به عنوان مثال، (5).constructor.name === "Number".

ولی:
1. در اینترنت اکسپلورر اصلا اینطور نیست، حتی در 9th.
2. در Host-objects، مرورگرها دوباره هر چیزی که زیاد است را قالب بندی می کنند (و اغلب آنها اصلاً این ویژگی را ندارند). در Opera، DOMElement یک نام سازنده به طور کلی Function.prototype دارد.
3. آرگومان دوباره "شیء".

نتیجه گیری

هیچ یک از روش های ارائه شده تعریف 100٪ از نوع / کلاس مقدار را در همه مرورگرها ارائه نمی دهد. با این حال، آنها با هم به شما اجازه انجام این کار را می دهند.

در آینده نزدیک سعی خواهم کرد تمام داده ها را در جداول جمع آوری کنم و مثالی از یک تابع تعریف ارائه کنم.

اپراتور نوعی ازرشته ای را برمی گرداند که نوع عملوند را نشان می دهد.

نحو

عملوند از نوع عملگر پیروی می کند:

نوعی از عملوند

مولفه های

عملوندعبارتی است که نشان دهنده شی یا بدوی است که نوع آن باید برگردانده شود.

شرح

جدول زیر مقادیر بازگشتی احتمالی typeof را فهرست می کند. اطلاعات تکمیلیدر مورد انواع و بدوی در صفحه است.

مثال ها

// نوع اعداد 37 === "تعداد"; نوع 3.14 === "تعداد"; typeof(42) === "تعداد"; typeof Math.LN2 === "تعداد"; نوع بی نهایت === "تعداد"; نوع NaN === "تعداد"; // حتی اگر از نوع "Not-A-Number" Number(1) === "number"; // هرگز از این نماد استفاده نکنید! // نوع رشته های "" === "رشته"; typeof "bla" === "string"; نوع "1" === "رشته"; // توجه داشته باشید که عدد داخل رشته همچنان از نوع string typeof (نوع 1) است === "string"; // typeof همیشه یک رشته را در این مورد برمی گرداند typeof String("abc") === "string"; // هرگز از این نماد استفاده نکنید! // Booleans typeof true === "boolean"; typeof false === "boolean"; typeof Boolean(true) === "Boolean"; // هرگز از این نماد استفاده نکنید! // Symbols typeof Symbol() === "symbol" typeof Symbol("foo") === "symbol" typeof Symbol.iterator === "symbol" // Undefined typeof undefined === "undefined"; typeof statementButUndefinedVariable === "undefined"; typeof undeclaredVariable === "undefined"; // Objects typeof(a: 1) === "object"; // از Array.isArray یا Object.prototype.toString.call // برای تمایز بین اشیاء معمولی و آرایه ها typeof استفاده کنید === "object"; typeof new Date() === "object"; // هر چیزی زیر منجر به خطا و مشکلات می شود. استفاده نکن! نوع جدید بولی (true) === "object"; typeof new Number(1) === "object"; typeof new String("abc") === "object"; // توابع typeof function() () === "function"; typeof class C() === "function"; typeof Math.sin === "function";

خالی

// این از زمان تولد نوع جاوا اسکریپت تعریف شده است. null === "object";

در اولین پیاده سازی جاوا اسکریپت، مقادیر با یک نوع برچسب و جفت مقدار نشان داده می شدند. نوع برچسب برای اشیا 0 بود. بنابراین، نوع تگ برای null null بود، بنابراین مقدار بازگشتی typeof جعلی است. ()

یک اصلاح در ECMAScript (از طریق غیر فعال کردن) پیشنهاد شده است اما رد شده است. این منجر به نوع null === "null" می شود.

با استفاده از اپراتور جدید

// همه توابع سازنده ایجاد شده با "new" از نوع "object" خواهند بود var str = new String("String"); var num = new Number(100); typeofstr; // نوع "object" num را برگردانید. // "object" را برمی گرداند // اما یک استثنا برای Function constructor var func = new Function(); نوع تابع; // برگرداندن "function"

عبارات با قاعده

عبارات منظمی که نامیده می شوند در برخی از مرورگرها اضافه شده غیر استاندارد بودند.

Typeof /s/ === "function"; // Chrome 1-12 سازگار با ECMAScript 5.1 typeof /s/ === "object"; // Firefox 5+ با ECMAScript 5.1 مطابقت دارد

اشکالات مربوط به مناطق مرده موقت

قبل از ECMAScript 2015، عملگر typeof تضمین شده بود که یک رشته را برای هر عملوندی که با آن فراخوانی می شد، برگرداند. این با اضافه شدن اعلان‌های let و const با محدوده بلوک غیربالابر تغییر کرد. حال اگر متغیرها با let و const اعلان شوند و typeof در بلوک اعلان متغیر بر روی آنها فراخوانی شود، اما قبل از اعلان، یک ReferenceError پرتاب می شود. این رفتار با متغیرهای اعلام نشده متفاوت است، که برای آنها typeof "تعریف نشده" برمی گردد. متغیرهای محدوده بلوک در یک "منطقه مرده موقت" هستند که از ابتدای بلوک تا لحظه اعلام متغیرها ادامه دارد. در این منطقه، تلاش برای دسترسی به متغیرها یک استثنا ایجاد می کند.

Typeof undeclaredVariable === "undefined"; نوع newLetVariable; اجازه دهید newLetVariable; // نوع ReferenceError of newConstVariable; const newConstVariable = "سلام"; // ReferenceError

استثناها

در همه مرورگرهای فعلی، یک شی میزبان document.all غیر استاندارد وجود دارد که از نوع Undefined است.

Typeof document.all === "undefined";

اگرچه مشخصات، نام‌های نوع سفارشی را برای اشیاء عجیب و غریب غیر استاندارد مجاز می‌سازد، اما لازم است این نام‌ها با نام‌های از پیش تعریف‌شده متفاوت باشند. وضعیتی که document.all از نوع تعریف نشده است باید به عنوان نقض استثنایی قوانین در نظر گرفته شود.

مشخصات فنی

مشخصات وضعیت نظرات
آخرین پیش نویس ECMAScript (ECMA-262)
پیش نویس
ECMAScript 2015 (نسخه ششم، ECMA-262)
تعریف "نوع اپراتور" در این مشخصات.
استاندارد
ECMAScript 5.1 (ECMA-262)
تعریف "نوع اپراتور" در این مشخصات.
استاندارد
ECMAScript نسخه سوم (ECMA-262)
تعریف "نوع اپراتور" در این مشخصات.
استاندارد
ECMAScript نسخه اول (ECMA-262)
تعریف "نوع اپراتور" در این مشخصات.
استاندارد تعریف اولیه پیاده سازی شده در جاوا اسکریپت 1.1

سازگاری مرورگر

داده های سازگاری را در GitHub به روز کنید

کامپیوترهاسیارسرور
کرومحاشیه، غیرمتمرکزفایرفاکساینترنت اکسپلورراپراسافارینمای وب اندرویدکروم برای اندرویدفایرفاکس برای آندرویداپرا برای اندرویدسافاری در iOSاینترنت سامسونگNode.js
نوعی ازکروم حمایت کامل 1 حاشیه، غیرمتمرکز حمایت کامل 12 فایرفاکس حمایت کامل 1 IE حمایت کامل 3 اپرا حمایت کاملآرهسافاری حمایت کاملآرهوب ویو اندروید حمایت کامل 1 کروم اندروید حمایت کامل 18 فایرفاکس اندروید حمایت کامل 4 اپرا آندروید حمایت کاملآرهسافاری iOS حمایت کاملآرهاینترنت سامسونگ اندروید حمایت کامل 1.0 nodejs حمایت کاملآره

افسانه

حمایت کاملحمایت کامل

یادداشت های اختصاصی IE

در IE 6، 7 و 8، بسیاری از اشیاء میزبان، اشیا هستند، نه توابع. مثلا.