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

دنیای جاوااسکریپت ۲ - متغیرها در جاوااسکریپت

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

متغیرها همانند سیم‌هایی هستن که به انواع مقدارها متصل می‌شوند به مثال انتصاب 'Narwhal' به متغیر pet توجه کنید.

let pet = 'Narwhal';
Just Javascript By Maggie Appleton

عملیات انتصاب یا =

در سمت چپ علامت = متغیر یا همان سیم ما با یک اسم مانند pet در مثال بالا قرار می‌گیرد و در قسمت راست یک مقدار ویا یک عبارت که حاصل اجرای آن عبارت توسط جاوااسکریپت محاسبه شده و در نهایت یک مقدار قرار می‌گیرد.

خواندن مقدار یک متغیر

در لحظه‌ی اجرای کد زیر مقدار متغیر pet محاسبه شده و برای متد log ارسال می‌شود. 

console.log(pet);

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

function double(x) {
  x = x * 2;
}

let money = 10;
double(money);
console.log(money); // ?

اگر فرض ما بر این بود که با اجرای متغیر money برای متد double ارسال می‌شود انتظار می‌رفت که مقدار آن دوبرابر شود ولی در حقیقت مقدار آن متغیر در آن لحظه ارسال می‌شود و نه خود متغیر.

برای بهتر شکل گرفتن مدل ذهنیتان به مثال زیر و مدل گرافیکی متناظر با آن توجه کنید.

let x = 10;
let y = x;
x = 0;
Just Javascript By Maggie Appleton
Just Javascript By Maggie Appleton
Just Javascript By Maggie Appleton

سعی کنید یک مدل ذهنی برای قطعه کد زیر تصور کنید

let isSad = true;
let isHappy = !isSad; // The opposite
let isFeeling = isSad || isHappy; // Is at least one of them true?
let isConfusing = isSad && isHappy; // Are both true?

.

.

.

.

آیا به درستی به نتیجه مشابه دست یافتید؟ باید توجه کنید که انواع مقادیر اولیه یا primitive در این مدل ذهنی ما منحصر به فرد هستن و صرفا یک مقدار true و یک مقدار false از نوع Boolean در دنیای جاوااسکریپت وجود دارد.

Just Javascript By Maggie Appleton

حال اجازه دهید به تفاوت بین مقادیر دسته‌ی primitive و objects and functions بپردازیم. یکی دیگر از تفاوت‌های دسته‌ی دوم علاوه بر قابل تغییر بودن آنها این است که می‌توان مقادیر جدیدی از آن در دنیای جاوااسکریپت تولید کرد که صرفا مانند مقادیر دسته‌ی primitive ثابت و یکتا نیستند. به مثال‌های زیر توجه کنید.

سعی کنید یک مدل ذهنی از کدهای زیر که عملیات انتصاب یک مقدار از دسته‌ی مقادیر primitive است را تصور کنید.

let sisters = 3;
let musketeers = 3;

حال مدل ذهنی انتصاب چند مقدار از نوع object که ما هر بار در هر خط با استفاده از {} یک نمونه جدید از آن را ایجاد کردیم مقایسه کنید.

سعی کنید حدس بزنید در هر کدام از  ۳ حلقه for زیر چه تعداد از نوع‌های متفاوت از مقادیر به متد console.log ارسال شد.

for (let i = 0; i < 7; i++) {
  console.log(2);
}
for (let i = 0; i < 7; i++) {
  console.log({});
}
for (let i = 0; i < 7; i++) {
  console.log(function() {});
}

وقتی حلقه اول ۷ مرتبه اجرا می‌شود، ۷ بار تنها یک مقدار 2 که از نوع primitive می‌باشد یعنی آن عدد 2 صرفا یک شیئ منحصربفرد در دنیای جاوااسکریپت است.

اما پس از اجرای حلقه دوم و سوم ۷ شیئ متفاوت و متمایز در دنیای جاوااسکریپت ایجاد شده و به متد console.log ارسال می‌شود.

§ فهرست « دنیای جاوااسکریپت »
  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 می‌باشند.