• انواع داده جاوا اسکریپت انواع داده جاوا اسکریپت متغیرهای جاوا اسکریپت و انواع داده

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

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

    بنابراین، شش نوع داده در جاوا اسکریپت وجود دارد:

    جاوا اسکریپت. شروع سریع

    مقدار بولی یا بولی

    بیایید نگاهی گذرا به هر یک از این انواع بیندازیم. بیایید با نوع داده رشته شروع کنیم. رشته شاید یکی از پرکاربردترین انواع داده باشد. ما همیشه با رشته ها مواجه می شویم: ورود کاربر یک رشته، نام محصول یک رشته، عنوان مقاله یک رشته و غیره است.

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

    var name = "جان"، نام خانوادگی = "Doe";

    var name = "جان"،

    نام خانوادگی = "گوله" ;

    جاوا اسکریپت. شروع سریع

    اصول اولیه جاوا اسکریپت را با یک مثال عملی از ساخت اپلیکیشن وب بیاموزید

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

    var num1 = 2، num2 = 3.4 num3 = -5.

    varnum1 = 2،

    num2 = 3.4

    num3 = - 5 ;

    لطفاً توجه داشته باشید که قسمت کسری عدد نه با کاما، بلکه با یک نقطه (نقطه اعشاری) از هم جدا می شود. همچنین شماره را می توان امضا کرد: -5 در مثال.

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

    بنابراین، نوع بولی یا نوع داده بولی. فقط دو مقدار ممکن دارد: true و false. برای ساده تر، می توان آنها را با کلمات "بله" و "نه" یا "درست" و "کاذب" مقایسه کرد. نمونه ای از نوشتن مقادیر بولی در جاوا اسکریپت:

    var yes = true، no = false;

    var بله = درست است

    نه = نادرست

    توجه داشته باشید که true و false به حروف بزرگ و کوچک حساس هستند. به عنوان مثال، در PHP، ثابت های true و false به حروف بزرگ و کوچک حساس هستند.

    دو مقدار ویژه بعدی null و undefined هستند. آنها بسیار شبیه به هم هستند و اساساً معنای یکسانی دارند - فقدان معنا. undefined مقدار متغیری است که به تازگی اعلام شده است اما روی یک مقدار تنظیم نشده است. مقدار تعریف نشده است null معمولاً روی یک متغیر نوشته می شود تا مقدار متغیر را باطل کند و به اصطلاح ناشناخته شود. در مقالات بعدی جزئیات کار با این نوع داده ها را در جاوا اسکریپت با جزئیات بیشتری خواهیم دید.

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

    // ورودی شی var user = ( نام: "جان"، نام خانوادگی: "دو"، سال: 2016 ); // دسترسی به ویژگی های شی هشدار (user.name); هشدار (user.family); هشدار (user.year);

    متغیرها در جاوا اسکریپت با یک کلمه کلیدی اعلان می شوند var، مثلا:

    پس از آن، می توانید مقدار متغیر را تنظیم کنید:

    x = "رشته نمونه";

    زبان جاوا اسکریپت به شما این امکان را می‌دهد که متغیرها را بدون اعلان به‌صورت مستقیم ایجاد کنید، به عنوان مثال:

    y = "رشته دوم";

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

    در جاوا اسکریپت، متغیرها نوع ثابتی ندارند، نوع متغیر با داده هایی که ذخیره می کند تعیین می شود. به عنوان مثال، شما می توانید
    یک متغیر را در معرض نمایش قرار دهید و یک عدد به آن اختصاص دهید و سپس یک رشته را اختصاص دهید.

    جاوا اسکریپت از پنج نوع داده اصلی پشتیبانی می کند: عدد- شماره؛ رشته- خطوط؛ بولی– نوع بولی؛ تعریف نشده- نامعین؛ خالی- خالی. این پنج نوع داده را انواع داده پایه می نامند زیرا انواع داده های پیچیده تری بر اساس آنها ساخته می شوند. سه مورد از نظر ذخیره سازی داده ها مورد توجه واقعی هستند: اعداد، رشته ها و بولی ها، و انواع نامشخص و خالی در موقعیت های خاص مورد توجه هستند.

    شماره

    در جاوا اسکریپت، نوع داده عددی شامل اعداد صحیح و اعداد واقعی است. اعداد صحیح می توانند مقادیر را از –2 53 قبل از 2 53 ، موارد واقعی می توانند مقادیر زیادی را در درون خود بگیرند 1.7976 ± 10308یا در داخل دقیق باشید 2.2250 × 10 -308 ± .

    اعداد را می توان به صورت نمایی نیز نوشت.

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

    اعداد در هگزادسیمال می توانند هنگام استفاده از عملیات بیتی و همچنین برای ذخیره رنگ ها مفید باشند - برای وب، همه رنگ ها به صورت هگزادسیمال ذخیره می شوند.

    زبان جاوا اسکریپت همچنین قابلیت نوشتن اعداد در سیستم اعداد هشتگانه را دارد: برای نوشتن یک عدد در ابتدا قرار داده می شود. 0 ، به دنبال آن اعداد از 0 قبل از 7 .

    شماره های خاص

    اگر نتیجه یک عملیات ریاضی خارج از محدوده باشد، متغیر مقدار را می گیرد بی نهایت- بی نهایت. هنگام انجام هر عملیاتی بر روی چنین عددی، نتیجه بی نهایت خواهد بود. در مقایسه، بینهایت مثبت همیشه از هر عدد واقعی بزرگتر است و بالعکس، بی نهایت منفی همیشه از هر عدد واقعی کمتر است.

    یکی دیگر از ارزش ویژه مهم است NaN- "نه عدد" (نه عدد). یک مثال معمولی از عملیاتی که برمی گردد NaN، تقسیم بر صفر است. برای تعیین اینکه آیا یک مقدار یک متغیر است یا خیر NaN، تابع استفاده می شود isNaN()، که برمی گردد درست است، واقعیاگر عدد واقعی باشد (از جمله بی نهایت)، و نادرستاگر مقدار متغیر NaN.

    اعداد ویژه حداکثر و حداقل مقادیری هستند که یک متغیر می تواند بگیرد. تمام اعداد ویژه در جدول نشان داده شده است:

    رشته های

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

    پس از ایجاد یک رشته، دارای یک ویژگی - است طول، که طول رشته و تعداد زیادی روش را برمی گرداند:

    charAt(فهرست مطالب: Number) : String - کاراکتر را در یک موقعیت خاص برمی گرداند.

    concat([رشته 1:رشته[, [, stringN: رشته]]]]) : رشته - رشته ها را به هم متصل می کند (شبیه به عملگر "+").

    indexOf(رشته فرعی:رشته[, startIdex: Number]) : Number - تعداد وقوع رشته فرعی را در رشته برمی گرداند، یک پارامتر اختیاری تعداد کاراکتری است که جستجو از آن شروع می شود. اگر رشته فرعی پیدا نشد، برمی گردد -1 . جستجو از چپ به راست انجام می شود، برای جستجو از راست به چپ از روش استفاده می شود lastIndexOf()، که نحوی مشابه دارد.

    جایگزین کردن(rgExp:regExp، جایگزین متن: String) : String - یک عبارت منظم را با یک رشته جایگزین می کند.

    شکاف([ جداکننده: ( رشته | RegExp ) [, حد: شماره]]) : آرایه - یک رشته را به آرایه ای از رشته های فرعی تقسیم می کند. به عنوان پارامتر اول، یک جداکننده ارسال می شود که بر اساس آن تقسیم انجام می شود، اگر جداکننده مشخص نشده باشد، یک آرایه حاوی یک عنصر با رشته اصلی برگردانده می شود. پارامتر دوم حداکثر تعداد عناصر در آرایه برگشتی را مشخص می کند.

    substr(شروع کنید:عدد[، طول: Number]) : رشته - رشته فرعی را برمی گرداند که از یک موقعیت خاص شروع می شود و طول خاصی دارد.

    رشته فرعی(شروع کنید:عدد، پایان: Number) : رشته - رشته فرعی را برمی گرداند که در موقعیت های مشخص شده توسط پارامترها شروع و پایان می یابد.

    نوع بولی

    متغیرهای بولی می توانند یکی از دو مقدار را داشته باشند: درست است، واقعی- حقیقت؛ نادرست- دروغ. متغیرهای بولی اغلب در یک دستور شرطی استفاده می شوند اگر. مثال:

    var doAlert = true;

    if (doAlert) ( هشدار ("سلام، جهان!")؛ )

    متغیرهای نوع Undefined و Null

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

    تایپ کنید خالیبه معنای یک مقدار خالی است. مثالی از اعلان یک متغیر خالی:

    آرایه ها

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

    myArr = "سلام!";

    اعلان یک آرایه خالی و یک آرایه حاوی داده:

    var valaArr = ;

    var filledArr = ["سلام"، "جهان"];

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

    var myArr = [,,];

    // یک آرایه 3x2 ایجاد کنید و عنصر موجود را خروجی بگیرید
    در ردیف سوم، در ستون دوم، برابر با 6.

    از آنجایی که یک آرایه در اصل یک شی است، می توان آن را به صورت زیر اعلام کرد.

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

    Console.log (10 + "cars"); // "10 ماشین". عدد به طور ضمنی به یک رشته console.log("7" * "4") تبدیل می‌شود. // 28. هر دو رشته به طور ضمنی به اعداد تبدیل می شوند

    تبدیل ضمنی- این زمانی است که مفسر به طور خودکار تبدیل نوع را انجام می دهد، یعنی بدون مشارکت برنامه نویس. تبدیل صریح- این زمانی است که خود برنامه نویس تبدیل را انجام می دهد. تبدیل صریح نیز به عنوان شناخته شده است ریخته گری نوع:

    Console.log("7" * "4"); // 28. تبدیل ضمنی console.log(Number("7") * Number("4")); // 28. تبدیل صریح

    جدول زیر نحوه تبدیل مقادیر جاوا اسکریپت از یک نوع به نوع دیگر را توضیح می دهد. سلول های خالی مربوط به موقعیت هایی است که نیازی به تبدیل نیست:

    معنی تبدیل به:
    رشته عدد بولی یک شی
    تعریف نشده
    خالی
    "تعریف نشده"
    "خالی"
    NaN
    0
    نادرست
    نادرست
    نوع خطا
    نوع خطا
    درست است، واقعی
    نادرست
    "درست است، واقعی"
    "کاذب"
    1
    0
    بولی جدید (درست)
    بولی جدید (نادرست)
    "" (خط خالی)
    "1.2"
    "یک"
    "-10"
    "+10"
    "011"
    "0xff"
    0
    1.2
    NaN
    -10
    10
    11
    255
    نادرست
    درست است، واقعی
    درست است، واقعی
    درست است، واقعی
    درست است، واقعی
    درست است، واقعی
    درست است، واقعی
    رشته جدید ("")
    رشته جدید ("1.2")
    رشته جدید ("یک")
    رشته جدید ("-10")
    رشته جدید ("+10")
    رشته جدید ("011")
    رشته جدید ("0xff")
    0
    -0
    NaN
    بی نهایت
    -بی نهایت
    3
    "0"
    "0"
    "NaN"
    "بی نهایت"
    "-بی نهایت"
    "3"
    نادرست
    نادرست
    نادرست
    درست است، واقعی
    درست است، واقعی
    درست است، واقعی
    newNumber(0)
    newNumber(-0)
    شماره جدید (NaN)
    newNumber (بی نهایت)
    newNumber(-Infinity)
    شماره جدید (3)
    () (هر شی)

    (آرایه خالی)
    (1 عنصر عددی)
    arr (هر آرایه دیگری)
    function()() (هر تابع)

    تبدیل اشیا را ببینید

    ""
    "9"
    تبدیل اشیا را ببینید
    تبدیل اشیا را ببینید

    تبدیل اشیا را ببینید
    0
    9
    NaN
    NaN
    درست است، واقعی

    درست است، واقعی
    درست است، واقعی
    درست است، واقعی
    درست است، واقعی

    برای تبدیل صریح به انواع ساده، از توابع زیر استفاده می شود: Boolean() , Number() , String() . برای تبدیل ضمنی، مفسر از همان توابعی استفاده می کند که برای تبدیل صریح استفاده می شود.

    برای تبدیل صریح، می توانید از عملگرها به جای توابع استفاده کنید. به عنوان مثال، اگر یکی از عملوندهای عملگر + یک رشته باشد، عملوند دیگر نیز به یک رشته تبدیل می شود. عملگر unary + عملوند خود را به عدد تبدیل می کند. اپراتور Unary! عملوند را به یک مقدار بولی تبدیل می کند و آن را معکوس می کند. همه اینها منجر به ظهور انواع عجیب و غریب زیر از تبدیل نوع شده است که در عمل می توان آنها را یافت:

    X + "" // همان رشته(x) +x //همان عدد(x). همچنین می توانید x - 0 !!x // مشابه Boolean(x) را ببینید

    تبدیل به اعداد

    تابع Number() مقادیر را طبق قوانین زیر تبدیل می کند:

    • مقادیر بولی true و false به ترتیب به 1 و 0 تبدیل می شوند.
    • اعداد بدون تغییر برگردانده می شوند.
    • مقدار null به 0 تبدیل می شود.
    • مقدار تعریف نشده به NaN تبدیل می شود.

    قوانین خاصی برای رشته ها وجود دارد:

    • اگر رشته فقط دارای ارقام با علامت + یا - یا بدون باشد، همیشه به یک عدد صحیح اعشاری تبدیل می شود. صفرهای ابتدایی نادیده گرفته می شوند، برای مثال "0011" به 11 تبدیل می شود.
    • اگر رشته یک عدد ممیز شناور با علامت + یا - یا بدون علامت باشد، به عدد ممیز شناور مربوطه تبدیل می‌شود (صفرهای ابتدایی نیز نادیده گرفته می‌شوند).
    • اگر رشته یک عدد هگزادسیمال باشد، به عدد صحیح اعشاری مربوطه تبدیل می شود.
    • اگر رشته خالی باشد به 0 تبدیل می شود.
    • اگر رشته حاوی چیزی متفاوت از گزینه های قبلی باشد، به NaN تبدیل می شود.
    • برای اشیا، متد valueOf() فراخوانی می شود و مقداری که برمی گرداند به طور خودکار طبق قوانین قبلی تبدیل می شود. اگر این تبدیل منجر به NaN شود، متد toString() فراخوانی می شود و قوانین تبدیل رشته ها به اعداد اعمال می شود.

    عملگرهای + و - unary مانند تابع Number() کار می کنند.

    تبدیل بولی

    تابع Boolean() یک مقدار را به معادل بولی خود تبدیل می کند:

    • مقادیر زیر هنگام تبدیل به false ارزیابی می شوند: undefined، null، 0، -0، NaN، "" .
    • مقدار false بدون تغییر برگردانده می شود.
    • تمام مقادیر دیگر به true تبدیل می شوند.

    تبدیل به رشته

    تابع String() مقادیر را طبق قوانین زیر تبدیل می کند:

    • برای همه مقادیر به جز null و undefined، متد toString() به طور خودکار فراخوانی می شود و نمایش رشته ای از مقدار برگردانده می شود.
    • برای null، رشته "null" برگردانده می شود.
    • برای تعریف نشده، رشته "undefined" برگردانده می شود.

    تبدیل انواع ساده به اشیا

    برای تبدیل مقادیر ساده به آبجکت، از سازنده های Boolean() , Number() , String() استفاده می شود:

    oNum = شماره جدید (3); var oStr = رشته جدید ("1.2"); var oBool = new Boolean(true); هشدار (نوع oNum)؛ // هشدار "object"(typeof oStr); // هشدار "شیء" (نوع oBool); // "هدف - شی"

    تبدیل اشیا به مقادیر ساده

    همه اشیا دو روش تبدیل را به ارث می برند: toString() و valueOf().

    متد toString() یک نمایش رشته ای از شی را برمی گرداند. به طور پیش فرض، هیچ چیز جالبی را برنمی گرداند:

    Alert((x: 1).toString()); // ""

    برخی از انواع، نسخه های تخصصی تری از متد ()toString دارند. به عنوان مثال، متد toString() روی یک آرایه تمام عناصر آن را به رشته تبدیل می کند و سپس آنها را به یک رشته متصل می کند و بین آنها کاما قرار می دهد:

    Alert(.toString()); // "1،2،3"

    هدف متد valueOf() چندان واضح تعریف نشده است: در صورتی که چنین مقداری وجود داشته باشد، قرار است یک شی را به یک مقدار ساده تبدیل کند که آن را نشان می دهد. اشیاء ذاتاً مقادیر ترکیبی هستند و اکثر اشیا را نمی توان به عنوان یک مقدار ساده نشان داد، بنابراین به طور پیش فرض متد valueOf() یک مقدار ساده را برمی گرداند، بلکه یک ارجاع به آن است:

    هشدار(نوع(x:2).valueOf()); // "هدف - شی"

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

    • اگر شی دارای متد toString() باشد، مفسر آن را فراخوانی می کند. اگر یک مقدار ساده برگرداند، مفسر مقدار را به رشته تبدیل می کند (اگر رشته نباشد) و نتیجه تبدیل را برمی گرداند.
    • اگر شی دارای متد ()toString نباشد، یا اگر آن متد مقدار ساده ای را برنگرداند، مفسر وجود متد ()valueOf را بررسی می کند. اگر این روش تعریف شده باشد، مفسر آن را فراخوانی می کند. اگر مقدار ساده ای را برگرداند، مفسر آن مقدار را به رشته تبدیل می کند (اگر رشته ای نباشد) و نتیجه تبدیل را برمی گرداند.

    هنگام تبدیل یک شی به عدد، مفسر همان اعمال را انجام می دهد، اما ابتدا سعی می کند متد valueOf() را اعمال کند:

    • اگر شی دارای یک متد valueOf() باشد که یک مقدار ساده را برمی گرداند، مفسر آن مقدار را (در صورت لزوم) به عدد تبدیل می کند و نتیجه را برمی گرداند.
    • اگر شی دارای متد valueOf() نباشد، یا اگر این متد مقدار ساده ای را برنگرداند، مفسر وجود متد toString() را بررسی می کند. اگر شی دارای یک متد toString() باشد که یک مقدار ساده را برمی گرداند، مفسر تبدیل را انجام می دهد و مقدار حاصل را برمی گرداند.
    • در غیر این صورت، مفسر استنباط می کند که نه toString() و نه valueOf() یک مقدار ساده به دست نمی دهند و TypeError را افزایش می دهند.

    متدهای toString() و valueOf() خواندن/نوشتن هستند، بنابراین می‌توانید آنها را نادیده بگیرید و به صراحت مشخص کنید که چه چیزی هنگام تبدیل برگردانده می‌شود:

    var obj = (); obj.toString = function() ( بازگشت "object"; ); alert("این است " + obj); // "این یک شی است"

    تصمیم گرفتم یک سری مقاله بنویسم به نام "مشکل در مورد ساده". این چرخه به زبان جاوا اسکریپت اختصاص خواهد یافت. چرا "سخت در مورد ساده"؟ زیرا هر آنچه را که خواهم گفت، با در نظر گرفتن ویژگی های مفسر، از انواع داده ها شروع می کنم. همه این کارها انجام می شود تا بعداً بتوان به سادگی در مورد پیچیده صحبت کرد، به عنوان مثال، در مورد روش های وراثت در جاوا اسکریپت و سایر الگوها.

    جاوا اسکریپت یک زبان برنامه نویسی شی گرا با یک سازمان نمونه است.
    "با یک سازمان نمونه" به چه معناست، در مقاله بعدی صحبت خواهیم کرد (قطعاً خواهد بود)، اما چرا "شی گرا" است و آیا همه چیز در JS یک شی است، امروز خواهیم فهمید.
    JS برای تحقق هدف خود فقط به 9 نوع نیاز دارد. علاوه بر این، تنها 6 مورد از آنها برای برنامه در دسترس هستند، 3 مابقی فقط در سطح پیاده سازی در دسترس هستند و با مشخصات مورد استفاده قرار می گیرند. در نگاه اول (و این اولین تصور اشتباه است) همه چیز در JS یک شی است. بنابراین، پنج نوع از شش نوع موجود در برنامه، به اصطلاح اولیه هستند و شی نیستند (در زیر توضیح خواهم داد که چرا و چگونه آنها با اشیا اشتباه گرفته می شوند). این پنج اصل اولیه عبارتند از:

    - رشته (s='str')
    - تعداد (n=10)
    - بولی (b=true)

    و همانطور که من آنها را "انواع فلسفی" می نامم:
    - پوچ (v = null)
    - تعریف نشده (u = تعریف نشده)

    فلسفی در آن null به این معنی است که چیزی به متغیر اختصاص داده نشده است، و undefined به این معنی است که تهی بودن به متغیر اختصاص داده شده است. تفاوت بین "هیچ" و "پوچی" در این مورد چیست - در اوقات فراغت خود فکر کنید. حالا ما این کار را نمی کنیم.

    ششمین نوع موجود در برنامه (شیء) عبارت است از:
    -هدف - شی(آن را با سازنده Object اشتباه نگیرید، اکنون فقط در مورد انواع انتزاعی صحبت می کنیم!) تنها نوعی است که اشیاء را در جاوا اسکریپت نشان می دهد.
    یک شی یک ساختار داده است (یک مجموعه کامل از آنها) که به صورت مجموعه ای از جفت های کلید-مقدار نمایش داده می شود. مقدار می تواند هر یک از انواع داده ها باشد - سپس یک ویژگی شی یا حتی یک تابع خواهد بود - سپس یک متد از شی خواهد بود.

    راه های زیادی برای کار با بدوی وجود دارد. از این واقعیت شروع می شود که می توان آنها را از طریق literals یا از طریق سازنده به متغیرها اختصاص داد و با این واقعیت پایان داد که اولیه ها را نمی توان به هیچ وجه به متغیرها اعلام کرد و مستقیماً با آنها کار کرد. ابتدایی ها همچنین می توانند در متغیرهای سراسری و در متغیرهای محلی باشند.

    در اینجا چند نمونه آورده شده است:

    varv1; //تغییر تعریف نشده (خالی) محلی var v2="2"; //string متغیر تحت اللفظی محلی var v3 = new String(2); //رشته متغیر محلی از طریق سازنده اعلام شده است. یک شی جدید از نوع String v4 = String(2) ایجاد می کند. متغیر جهانی //string از طریق سازنده فراخوانی می شود. ایجاد متغیر window.v4 "2".length; // رشته به متغیر تبدیل نمی شود، اما می توان از آن به عنوان یک Object 34..toString(); //number به یک متغیر تبدیل نمی شود، اما می توان از آن به عنوان یک شی 12 استفاده کرد. toString(); .

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

    این تصور غلط زمانی تشدید می‌شود که مثلاً نوع یک متغیر را بررسی کنیم

    varv = null; typeofv;

    و در پاسخ "ابژه" دریافت می کنیم.

    و اگر بنویسیم:
    var v = null; v instanceofObject;

    سپس در سر به هم ریخته می شود، زیرا نتیجه آخرین خط "کاذب" خواهد بود. یعنی متغیر v از نوع Object است، اما از نوع Object به ارث نمی رسد. چه لعنتی؟!

    اول، من catch را با typeof null توضیح می دهم. این عملگر نوع شی را برمی گرداند. اما واقعیت این است که عملگر typeof مقدار رشته‌ای را برمی‌گرداند که از یک جدول سخت‌کد گرفته شده است، جایی که نوشته شده است: "برای null، "object" را برگردانید. عملگر instanceof بررسی می کند که آیا چیزی به نوع داده مشخص شده تعلق دارد یا خیر. در مقاله بعدی به شما خواهم گفت که چگونه این کار را انجام می دهد، اما به شما اطمینان می دهم، در این مورد به درستی کار کرده است، ابتدایی تهی به هیچ وجه از نوع Object به ارث برده نشده است - این به خودی خود است، ابتدایی پایین ترین مرحله است. توسعه.

    خوب، ما typeof و instanceof را فهمیدیم، اما متدها بر روی primitive ها نامیده می شوند - درست مانند اشیا! اگر شیء نباشد چه؟

    موضوع اینجاست. چیزی به نام توابع wrapper (سازنده ها) وجود دارد (و دوباره همه چیز در مقاله دوم مشخص خواهد شد). آنها برای همه اولیه ها (Number()، Boolean()، String()) و همچنین سایر موارد وجود دارند. ماهیت آنها ایجاد یک شی از یک بدوی است که دارای روش های کمکی برای کار با نوع معینی از اولیه است.
    به عنوان مثال، می توانید یک متغیر مانند این ایجاد کنید:

    Varnum = newNumber(23.456);

    در این صورت یک شی از 23.456 اولیه بدست می آوریم.
    برای نوع عدد، سازنده Number() دارای یک روش کمکی toPrecision() است که تعداد ارقام مهم عدد را تعیین می کند. به عنوان مثال، اگر عدد 23.456 روی 4 رقم قابل توجه تنظیم شود، عدد 23.45 به دست می آید.
    و این زمانی است که ما سعی می کنیم به امر بدوی به عنوان یک شی اشاره کنیم:

    (23.456). toPrecision (4);

    مفسر به طور موقت ابتدا با فراخوانی Number(23.456) و سپس متد toPrecision() را بر روی این شیء فراخوانی می کند که اکنون دارای آن است. بنابراین، بسیاری از مردم به اشتباه معتقدند که همه چیز در JS یک شی است.

    مثال دیگری نیز وجود دارد که گمراه کننده است و باعث سوء تفاهم از آنچه در حال رخ دادن است. این هم کد:

    var str = 'str'; str.test = 'تست'; //هیچ خطایی وجود نخواهد داشت، برنامه به کار خود ادامه می دهد، اما console.log(str.test); //تعریف نشده

    اگر مثل قبل فکر می کردیم که str یک شی است، تعجب می کردیم که چرا ویژگی تست جدید را به خاطر نمی آورد. اما اکنون می دانیم که وقتی از یک اولیه به عنوان یک شی یاد می شود، به طور موقت در یک شی از نوع String پیچیده می شود. اما پس از اتمام عملیات، این لفاف ناپدید می شود و به همراه آن ویژگی تست جدید نیز از بین می رود. همین است، جادو نیست.

    در واقع، با نگاه کردن به آینده، در حالی که یک چیز بدوی را در یک شیء قرار می دهیم، یک زنجیره کامل از وراثت ساخته می شود (ما بعداً در مورد نحوه سازماندهی آن صحبت خواهیم کرد)، اما در اصل چنین "ماتریوشکا" به نظر می رسد:

    شیء(شماره(<примитив>)). والد هر شی در JS، به هر صورت، Object خواهد بود. هنگامی که یک ویژگی در یک شی فراخوانی می شود، جستجو از طریق تمام این "matryoshka" می گذرد تا زمانی که این ویژگی را در یکی از آبجکت ها پیدا کند یا تعریف نشده برمی گرداند، یا اگر یک متد جستجو شده باشد، یک استثنا ایجاد می کند. بنابراین، ویژگی های شیء Object برای اولیه نیز در دسترس است. ما در مورد چگونگی کارکرد وراثت نمونه اولیه و ظرافت های آن در مقاله دوم صحبت خواهیم کرد.

    برای فتنه در مورد مقاله دومی که می خواهم منتشر کنم، در مورد یک نکته دیگر مربوط به توابع توسط سازنده ها به شما می گویم - این تبدیل نوع است. JS یک زبان با تایپ قوی نیست. این بدان معناست که هنگام اعلام یک متغیر، نیازی به تعیین نوع آن نیست و علاوه بر این، در حین عملیات برنامه، داده هایی از هر نوع مطلق را می توان در این متغیر قرار داد. و همچنین می توانیم برای مثال از متغیرهای رشته ای در عملیات ریاضی یا برعکس از اعداد در عملیات الحاق استفاده کنیم. مثال:

    var str = "abc"; str+1; // "abc1"

    در اینجا، یک اولیه از نوع شماره - 1 به یک رشته اولیه تبدیل می شود. در اشیاء، این ویژگی از طریق فراخوانی متد toString() در دسترس است، در اشیاء نوع شماره، متد valueOf() وجود دارد که یک عدد از نوع اولیه را برمی گرداند. اما ما به نوعی گفتیم که فقط اشیا می توانند متد داشته باشند. بنابراین در فرآیند تبدیل یک نوع اولیه از یک نوع به نوع دیگر، بسته بندی به یک شی نیز وجود دارد؟ من به شما اطمینان می دهم که اینطور نیست. زمانی که تابع سازنده توسط مفسر بدون عملگر جدید فراخوانی شود، این روش به طور ضمنی فراخوانی می شود. چه نوع عملگر جادویی جدید است و وقتی تابع سازنده بدون آن فراخوانی می شود چه اتفاقی می افتد و بالاخره این تابع سازنده چیست، در مقاله بعدی صحبت خواهیم کرد. در حال حاضر، حرف من را قبول کنید - تبدیل نوع بلافاصله اتفاق می افتد - از ابتدایی به ابتدایی.

    البته تا اینجای کار، سوالات بیشتر از پاسخ هاست، با این حال، باور کنید، پس از خواندن مقاله دوم همه چیز بسیار واضح تر خواهد شد. در اینجا من اساساً تعدادی سؤال را برانگیختم و مطرح کردم - به اصطلاح، ذهن ها را برانگیختم. اما هنوز هم می توان از این مقاله چیزهایی آموخت:
    1. علیرغم اینکه نظر رایج "همه چیز در JS یک شی است" اینطور نیست، ما متوجه شدیم که از 6 نوع داده موجود برای یک برنامه نویس، 5 نوع اولیه هستند و تنها یکی نشان دهنده نوع اشیاء است.
    2. ما در مورد اشیا یاد گرفتیم که این ساختار داده ای است که شامل جفت های کلید-مقدار است. زمانی که مقدار می تواند هر یک از انواع داده ها باشد (و این یک ویژگی شی خواهد بود) یا یک تابع (و این یک روش شی خواهد بود).
    3. اما بدوی اشیاء نیستند. اگرچه می توانید با آنها مانند یک شی کار کنید (و این باعث این تصور اشتباه می شود که یک شی بدوی است)، اما ...
    4. متغیرها را می توان هم ساده (به معنای واقعی کلمه) (var a = 'str') و هم از طریق یک تابع سازنده (wrapper) (var a = new String('str')) اعلام کرد. در حالت دوم، ما دیگر یک primitive دریافت نمی کنیم، بلکه یک شی ایجاد شده توسط تابع wrapper ()String دریافت می کنیم. (اپراتور جادویی جدید چیست و تابع سازنده چیست، در ادامه خواهیم آموخت).
    5. ما یاد گرفتیم که با ایجاد یک لفاف بر روی ابتدایی (رشته جدید('str')) است که می توانید با آن مانند یک شی کار کنید. وقتی مفسر می‌خواهیم به‌عنوان یک شی با آن کار کنیم، مفسر در اطراف مفسر اولیه ایجاد می‌کند، اما پس از اتمام عملیات، از بین می‌رود (بنابراین، مفسر اولیه هرگز نمی‌تواند خاصیتی را که به آن اختصاص می‌دهیم به خاطر بیاورد. a.test = 'test' - ویژگی تست با wrapper ناپدید می شود).
    6. ما آموختیم که اشیاء دارای یک متد toString() هستند که نمایش رشته ای از شی را برمی گرداند (برای نوع عدد valueOf()، مقدار عددی را برمی گرداند).
    7. فهمیدیم که هنگام انجام عملیات الحاقی یا ریاضی، اولیه ها می توانند نوع خود را به نوع دلخواه بازتعریف کنند. برای این کار از توابع wrapper از نوع خود استفاده می کنند، اما بدون عملگر جدید (str = String(str)).
    8. و در نهایت، ما یاد گرفتیم که typeof مقادیر را از یک جدول سخت کد شده می گیرد (این همان جایی است که تصور اشتباه دیگری بر اساس typeof null //object از آنجا می آید).

    جاوا اسکریپتیا 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 را فراخوانی کنید و یک آرایه یا چیزی را به عنوان آرگومان تنظیم کنید و نتیجه را ببینید.

    پس گفتار

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

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