۳۱ ژانویه ۲۰۲۳

خلاصه‌ی فصل

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

ساختار کد

دستورات (statementها) با نقطه‌ویرگول انگلیسی (;) از یکدیگر جدا می‌شوند.

alert('Hello'); alert('World');

معمولاً همین که به خط بعدی می‌روید نیز به منزله‌ی جداسازی دستورات در نظر گرفته می‌شود، بنابراین این کد هم به درستی کار می‌کند:

alert('Hello')
alert('World')

به این موضوع «درج خودکار ویرگول‌نقطه (automatic semicolon insertion)» گفته می‌شود. ولی گاهی اوقات درست کار نمی‌کند، مثل اینجا:

alert("There will be an error after this message")

[1, 2].forEach(alert)

در بیشتر سبک‌های کدنویسی پیشنهاد شده است که حتماً بعد از هر دستور ویر‌گول‌نقطه گذاشته شود.

لازم نیست بعد از بلاک‌های کد {…} و ساختارهایی که با این بلاک‌ها ساخته می‌شوند، مثل حلقه‌ها ویرگول‌نقطه قرار دهید.

function f() {
  // بعد از ساخت تابع، نیازی به ویرگول‌نقطه نیست.
}

for(;;) {
  // بعد از حلقه نیازی نیست ویرگول‌نقطه بگذارید.
}

ولی با این حال اگر ویرگول‌نقطه‌ی اضافی در کد خود بنویسید مشکلی ایجاد نمی‌کند و نادیده گرفته می‌شود.

برای اطّلاعات بیشتر اینجا را ببینید ساختار کد.

حالت Strict

برای اینکه تمام قابلیت‌های مدرن جاوااسکریپت فعّال شود لازم است که فایل جاوااسکریپت خود را با عبارت "use strict" شروع کنیم:

'use strict';

...

این دستور می‌تواند در ابتدای یک فایل جاوااسکریپت یا ابتدای یک تابع نوشته شود.

بدون نوشتن "use strict" هم کد ما کار می‌کند، ولی بعضی چیزها در حالت قدیمی خود عمل می‌کنند. ما معمولاً رفتار مدرن آن‌ها را ترجیح می‌دهیم.

بعضی از ویژگی‌های مدرن جاوااسکریپت (مثل کلاس‌ها که بعداً به آن می‌رسیم) به صورت خودکار و بدون اینکه نیازی باشد "use strict" را بنویسیم کد را در حالت strict اجرا می‌کنند.

برای اطلاعات بیشتر اینجا را ببینید: حالت مدرن، “use strict”.

متغیّرها (Variables)

می‌تواند به شکل‌های زیر ساخته شود:

  • let
  • const (ثابت، نمی‌توان مقدارش را تغییر داد)
  • var (سبک قدیمی، که بعداً تفاوت‌هایش را می‌بینیم)

نام متغیّر می‌تواند شامل این موارد باشد: حروف و ارقام، ولی اوّلین کاراکتر نمی‌تواند رقم باشد- . کاراکترهای $ و _ هم مثل سایر حروف الفبا مجاز هستند- . حروف الفبای غیر انگلیسی و حروف تصویری هم مجاز هستند، ولی معمولاً استفاده نمی‌شوند- .

نوع متغیّر پویا است و هر نوع مقداری را می‌توان در آن نگهداری کرد:

let x = 5;
x = "John";

8 نوع داده وجود دارد:

  • عدد(number) برای اعداد اعشاری و اعداد صحیح،
  • bigint برای اعداد صحیح که طول دلخواه دارند،
  • رشته(string) برای متن‌ها،
  • بولین(boolean) برای مقادیر منطقی: true/false،
  • null: نوعی که فقط دارای مقدار خاص null است و نشان‌دهنده‌ی “خالی بودن” یا "وجود نداشت"ن است.
  • undefined: نوعی که فقط دارای مقدار خاص undefined است و نشان‌دهنده‌ی این است که چیزی “مقداردهی نشده”.
  • شیء(object) و symbol: برای ساختارهای اطّلاعاتی پیچیده و شناسانگرهای منحصر به فرد که هنوز آنها را یاد نگرفته‌ایم.

عملگر typeof نوع هر مقداری را در قالب یک رشته به ما بر می‌گرداند با دو استثناء:

typeof null == "object" // اشتباهی در زبان جاوااسکریپت
typeof function(){} == "function" // تابع‌ها در اصل زیرمجموعه‌ای از اشیاء هستند

برای اطلاعات بیشتر متغیرها و انواع داده را ببینید

تعامل

ما از مرورگر به عنوان محیط کار خود استفاده می‌کنیم، در این محیط چند تابع برای ارتباط با کاربر وجود دارد:

prompt(question, [default])
question را به کاربر نمایش می‌دهد که از او می‌خواهد متنی را تایپ کند. بعد متن تایپ شده را بر می‌گرداند. در صورتی که کاربر روی “cancel” کلیک کند مقدار null را بر می‌گرداند.
confirm(question)
question را نشان می‌دهد و منتظر می‌ماند تا کاربر روی دکمه‌ی cancel یا ok کلیک کند. در صورت کلیک روی ok مقدار true و در صورت کلیک روی cancel یا زدن Esc مقدار false را برمی‌گرداند.
alert(message)
message را به کاربر نمایش می‌دهد

تمام این توابع modal هستند، آنها اجرای کد را متوقف می‌کنند و از تعامل کاربر با صفحه تا زمانی که جواب بدهد جلوگیری می‌کنند.

مثال:

let userName = prompt("Your name?", "Alice");
let isTeaWanted = confirm("Do you want some tea?");

alert( "Visitor: " + userName ); // Alice
alert( "Tea wanted: " + isTeaWanted ); // true

اطلاعات بیشتر در: تعاملی: alert، prompt، confirm.

عملگرها

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

عملگرهای محاسباتی
عملگرهای عادی: * + - /, و نیز % برای محاسبه‌ی باقیمانده‌ی تقسیم و ** برای به توان رساندن اعداد.

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

```js run
alert( '1' + 2 ); // '12', string
alert( 1 + '2' ); // '12', string
```
مقداردهی (Assignments)

دو نوع مقداردهی داریم: مقداردهی معمولی مثل a = b و مقداردهی ترکیبی مثل a *= 2.

بیتی (Bitwise)

عملگرهای بیتی با اعداد 32 بیتی در پایین‌ترین سطح یعنی بیت کار می‌کنند: زمانی که به آنها نیاز داشتید به مستندات مراجعه کنید.

شرطی (Conditional)

تنها اپراتور 3 پارامتری: cond ? resultA : resultB. اگر cond truthy باشد، resultA را برمی‌گرداند، در غیر این صورت resultB.

عملگرهای منطقی (Logical)

عملگر منطقی “و” && با عملگر “یا” || ارزیابی کوتاه انجام می‌دهند و سپس مقداری که ارزیابی در آنجا متوقف شود را برمی‌گردانند (نه حتما true/false). عملگر منطقی “نفی” ! عملوند را به boolean تبدیل می‌کند و مقدار برعکس را برمی‌گرداند.

عملگر Nullish coalescing

عملگر ?? راهی برای انتخاب یک مقدار تعریف شده از یک لیست متغیرها را مهیا می‌کند. نتیجه‌ی a ?? b برابر با a است مگر اینکه این متغیر null/undefined باشد که در این صورت برابر با b است.

عملگرهای مقایسه‌ای

عملگر بررسی تساوی (==) برای مقادیری که نوع متفاوتی از یکدیگر دارند، هر دو را به نوع عدد تبدیل می‌کند (به استثنای null و undefined که این دو با هم برابرند و با هیچ چیز دیگر برابر نیستند)، پس اینها برابرند:

alert( 0 == false ); // true
alert( 0 == '' ); // true