برنتی / می‌نویسم که فکر کنم

دنیای جاوااسکریپت ۱ - انواع مقدارها یا Values

1399.05.24·دنیای جاوااسکریپت

Just Javascript By Maggie Appleton

جاوااسکریپت شامل ۹ نوع از مقادیر هست که ۷ مورد آن از در دسته‌ی Primitive و یا اولیه و ۲ مورد دیگر در دسته‌ی Object و Function قرار دارند.

انواع مقادیر

  1. Primitive
  2. Objects and Functions

مقادیر اولیه یا Primitive

فرق اساسی انواع مقادیر دسته‌ی Primitive با دسته‌ی Objects and Functions در این است که آنها غیر قابل تغییر هستن در صورتی که مقادیر موجود در دسته‌ی Objects and Functions قابل ویرایش هستند.

Just Javascript By Maggie Appleton

سعی کنید خروجی مثال زیر را حدس بزنید:

let lastName = 'abc';
lastName[0] = 'i';
console.log(lastName);

خروجی این متد یا نمایش "abc" خواهد بود یا یک پیغام خطا که به فعال بودن strict mode بستگی دارد ولی هرگز "ibc" نمایش داده نخواهد شد به این دلیل که "abc" یک نوع مقدار غیر قابل ویرایش است.

تناقض؟؟

نظر شما در رابطه با مثال زیر چیست؟

let pet = 'Narwhal';
pet = 'The Kraken';
console.log(pet); // "The Kraken"

خب شاید با نگاه اول شاید بگید که خب مقدار "Narwhal" به "The Kraken" در این مثال تغییر پیدا کرد اما در حقیقت با عمل انتصاب صرفا متغیر pet به مقدار جدید و مجزای "The Kraken" اشاره می‌کند.
نکته‌: متغیرها برابر با مقادیر نیست و این دو شامل دو مفهوم مجزا هستن. متغیرها صرفا به مقادیر اشاره می‌کنند.

Just Javascript By Maggie Appleton

۱ـ لیست مقادیر اولیه یا Primitive 

  • Undefined
    • تنها شامل مقدار undefined
    • برای نشان دادن نداشتن مقدار بصورت غیر عمدی (کنترل نشده)
  • Null
    • تنها شامل مقدار null
    • برای نشان دادن نداشتن مقدار بصورت عمدی (توسط ما کنترل یا مدیریت شده)
  • Booleans
    • دو مقدار true و false
    • برای استفاده در عملیات منطقی
  • Numbers
    • بازه‌ای از اعداد (-110, 3.14, ... )
    • برای استفاده در محاسبات ریاضی
    • در کد زیر مثال‌هایی که موجب تولید مقادیر مختلف نوع number می‌شود آورده شده‌است.
let scale = 0;
let a = 1 / scale; // Infinity
let b = 0 / scale; // NaN
let c = -a; // -Infinity
let d = 1 / c; // -0
  • انواع رشته‌ها ("asdasd" , "aaa" , ... )
  • برای نگهداری نوشته‌ها
  • Symbols
    • کاربرد غیرمعمول
    • برای پنهانسازی جزئیات پیاده‌سازی
  • BigInts
    • کاربرد غیر معمول و جدید
    • برای استفاده در عملیات ریاضی که نیاز به مقادیر بزرگ در محاسبات دارد
Just Javascript By Maggie Appleton

۲ـ مقادیر غیر اصلی یا همان Functions و Objects

  • Objects
    • {}, [], new Date() و ...
    • برای دسته‌بندی کردن یک بخشی از داده‌ها و کدها
  • Functions
    • برای اشاره به بخشی از کدها
Just Javascript By Maggie Appleton

پیدا کردن نوع مقادیر در جاوااسکریپت با استفاده از typeof

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

typeof(4); // "number"

باگ جاوااسکریپت در تعیین نوع مقادیر با استفاده از typeof

به مثال زیر توجه کنید

typeof(null); // "object"

خروجی متد typeof جاوااسکریپ برای null مقدار "object" است درصورتی که null از نوع object نبوده و خودش یک نوع اصلی یا Primitive می‌باشد. (یک یادداشت از تاریخچه رخ دادن این باگ در جاوااسکریپت) امکان اصلاح این مشکل وجود نداشته به این دلیل که این باگ خیلی قدیمی بوده و رفع اون باعث ایجاد مشکل در وب‌سایتهای زیادی می‌شد.

خب حالا نظرتون در رابطه با مثال زیر چیه؟

typeof([]); // "object"

به نظرتون این هم باگ جاوااسکریپت هست و انتظار داشتین نوع arrays را دریافت کنید؟ اما اینطور نیست آرایه‌ها از نوع‌ها اصلی یا primitive نیستن و بنابراین از نوع object هستن و خروجی این کد صحیح است.

در جاوااسکریپت هیچ نوع دیگری وجود ندارد

شاید برای شما سوال پیش بیاید که خب تکلیف انواع دیگه مثل آرایه‌ها چی میشه؟

جاوااسکریپت فقط شامل همین ۹ نوع از مقادیر اصلی است که به شرح آن پرداختیم مابقی آن از مثل آرایه و تاریخ و ... از نوع Object به حساب می‌آیند. 

console.log(typeof([])); // "object"
console.log(typeof(new Date())); // "object"
console.log(typeof(/(hello|goodbye)/)); // "object"
§ فهرست « دنیای جاوااسکریپت »
  1. 1405.07.18هزار آیکون در یک میلی‌ثانیه: کش کردن رسم SVG به‌جای memoکامپوننت آیکونی که SVG را از داده می‌سازد در هر رندر کمی کار اضافه می‌کند. اندازه گرفتم memo کجا کمک می‌کند و کجا نه، و با نگه داشتن عناصر رسم هر آیکون، رندر مجدد هزار آیکون را از ۳.۶ به حدود ۱ میلی‌ثانیه رساندم.
  2. 1405.07.04ساختن هوکی شبیه useSyncExternalStore از صفربا useState و useEffect قدم‌به‌قدم هوکی می‌سازم که به یک store بیرونی subscribe شود، باگ هر نسخه را نشان می‌دهم و آخر کار توضیح می‌دهم چرا نسخه‌ی خودِ ری‌اکت کاری می‌کند که از کد کاربر برنمی‌آید.
  3. 1405.06.29مشکل Tearing در ری‌اکت چیست؟تیرینگ زمانی رخ می‌دهد که یک مقدار بیرون از چرخه‌ی رندر ری‌اکت حین رندر تغییر کند و کامپوننت‌های مختلف در یک فریم، دو مقدار متفاوت از همان داده را نشان بدهند.
  4. 1405.06.29چطور در دیجیکالا با useSyncExternalStore جلوی رندرهای اضافه را گرفتیموقتی داده‌ی ویجت‌های یک لیست با تأخیر و به‌صورت پلکانی می‌رسد، نگه‌داشتن آن در یک state یا Context مشترک باعث می‌شود کل لیست با هر آپدیت دوباره رندر شود؛ useSyncExternalStore به‌همراه React.memo راه می‌دهد فقط همان ویجتی که داده‌اش عوض شده رندر شود.
  5. 1399.06.03دنیای جاوااسکریپت - مقدمهآموزش ساده و روان اصول جاوااسکریپت با مدل ذهنی Dan Abramov
  6. 1399.06.01دنیای جاوااسکریپت ۵ - Prototypesمفهوم ساده‌ی Prototypes یا نمونه اولیه در جاوااسکریپت
  7. 1399.05.31دنیای جاوااسکریپت ۴ - mutate یا تغییر دادن object"مثال‌هایی از تغییر در object
  8. 1399.05.31دنیای جاوااسکریپت ۳ - انواع روش‌های مقایسه برابریانواع روش‌های مقایسه در جاوااسکریپت Object.is
  9. 1399.05.31دنیای جاوااسکریپت ۲ - متغیرها در جاوااسکریپتمتغیرها یا Variables در جاوااسکریپت و تفاوت آنها با مقادیر یا Values
  10. 1399.05.24دنیای جاوااسکریپت ۱ - انواع مقدارها یا Valuesجاوااسکریپت شامل ۹ نوع از مقادیر هست که ۷ مورد آن از نوع Primitive و یا اولیه و اصلی و ۲ مورد دیگر که از نوع Object و Function می‌باشند.