در این قسمت به صورت خلاصه مباحثی را که تا به حال یاد گرفتهایم مرور میکنیم. این مباحث که شامل نحوهی نوشتن دستورات، ساخت متغیّر، شرط، حلقه و تابع هستند اصول پایهی زبان جاوااسکریپت را تشکیل میدهند. بعد از این فصل وارد مبحث اشیاء در جاوااسکریپت خواهیم شد.
ساختار کد
دستورات (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
سایر عملگرهای مقایسهای هر دو طرف را تبدیل به عدد میکنند.
عملگر بررسی تساوی سختگیرانه
===
تبدیل نوع را انجام نمیدهد: نوع های متفاوت برای این عملگر همیشه به معنی مقدارهای متفاوت است.مقادیر
null
وundefined
خاص هستند. این دو مقدار با هم مساوی در نظر گرفته میشوند و با هیچ چیز دیگری مساوی نیستند.عملگرهای کوچکتر/بزرگتر رشتهها را کاراکتر به کاراکتر و به ترتیب حروف الفبا مقایسه میکنند، و بقیهی نوعها را به عدد تبدیل میکنند.
- سایر عملگرها
-
عملگرهای دیگری مثل کاما و غیره نیز در زبان جاوااسکریپت وجود دارند.
اطّلاعات بیشتر در: عملگرهای پایه، ریاضیات، مقایسه ها، عملگر های منطقی، عملگر Nullish coalescing '??'.
حلقهها
-
تا به حال با 3 نوع حلقه آشنا شدیم:
// 1 while (condition) { ... } // 2 do { ... } while (condition); // 3 for(let i = 0; i < 10; i++) { ... }
-
متغیّری که درون
for(let...)
ساخته میشود فقط در درون خود حلقه دیده میشود و قابل استفاده است. البته شما میتوانید کلمهیlet
را از اینجا حذف کنید تا از یکی از متغیّرهایی که از قبل ساختهاید استفاده کنید. -
دستورهای
break/continue
به اجازه میدهند تا از کل حلقه یا تکرار کنونی خارج شویم. از برچسبها(labels) برای شکستن حلقههای تو در تو استفاده کنید.
جزئیات بیشتر را در: حلقه ها: while و for .مطالعه کنید
بعداً که با اشیاء آشنا شویم چند مدل حلقهی دیگر را نیز در جاوااسکریپت میآموزیم.
ساختار switch
ساختار “switch” میتواند جایگزین چند بررسی از طریق if
بشود. در این ساختار به صورت خودکار از ===
برای مقایسهها استفاده میشود.
برای مثال:
let age = prompt('Your age?', 18);
switch (age) {
case 18:
alert("Won't work"); // نتیجه عدد نیست، بلکه رشته است
break;
case "18":
alert("This works!");
break;
default:
alert("Any value not equal to one above");
}
جزئیات بیشتر را در دستور "switch" مطالعه کنید.
تابعها (Functions)
ما تا به حال با سه روش برای ساخت تابعها آشنا شدیم:
-
Function Declaration:
function sum(a, b) { let result = a + b; return result; }
-
Function Expression:
let sum = function(a, b) { let result = a + b; return result; };
-
تابع پیکانی (Arrow Function)
// عبارت سمت راست let sum = (a, b) => a + b; // یا مدل چند خطی با {...}، که در این حالت باید return :هم بنویسید let sum = (a, b) => { // ... return a + b; } // بدون آرگومان ورودی let sayHi = () => alert("Hello"); // فقط یک آرگومان let double = n => n * 2;
- تابعها میتوانند دارای متغیّرهایی باشند که داخل بدنهی تابع یا پارامترهای آن ساخته میشوند که به آنها متغیّرهای محلّی میگوییم. این گونه متغیّرها فقط داخل خود تابع دیده میشوند و فقط در تابع به آنها دسترسی داریم.
- پارامترهای تابع میتوانند مقدار پیشفرض بپذیرند:
function sum(a = 1, b = 2) {...}
- تابعها همیشه چیزی را بر میگردانند. اگر داخل تابع اصلاً از دستور
return
استفاده نشده باشد، نتیجهundefined
میشود.
برای مشاهدهی جزئیات بیشتر توابع (Functions) و مقاله "function-expressions-arrows" پیدا نشد را ببینید.
هنوز خیلی مطلب باقی مانده است
موارد فوق تنها خلاصهای از قابلیتهای جاوااسکریپت بود. تا الآن فقط مبانی این زبان را یاد گرفتهایم. در ادامه با قابلیتها و ویژگیهای حرفهای جاوااسکریپت آشنا خواهیم شد.