JavaScript زبانی پویا و مبتنی بر نمونهی اولیه است. چند «مقدار اولیه» دارد و بقیه شیء در نظر گرفته میشوند.
هرچند بیشتر به عنوان زبان اسکریپتنویسی صفحات وب شناخته میشود، محیطهای غیرمرورگری بسیاری هم از آن استفاده میکنند، مثلاً Node.js. این زبان فعالانه در حال توسعه است و چون چندپارادایمی است، سبکهای برنامهنویسی گوناگونی را ممکن میکند. JavaScript زبانی پویاست که سبکهای شیءگرا، دستوری و اعلانی (مثلاً برنامهنویسی تابعی) را پشتیبانی میکند.
راههای اصلی چندی برای انتساب مقدار به اسم در JavaScript وجود دارد: استفاده از متغیر یا ثابت. در Exercism، متغیرها همیشه به شکل camelCase نوشته میشوند؛ ثابتها به شکل SCREAMING_SNAKE_CASE. راهنمای رسمیای برای پیروی وجود ندارد و شرکتها و سازمانهای مختلف راهنمای سبک متفاوتی دارند. راحت باشید و متغیرها را هر طور که میخواهید بنویسید. مزیت نوشتن آنها به همان شکلی که تمرینها آماده شدهاند این است که در رابط وب و بیشتر IDEها به شکل متفاوتی برجسته میشوند.
متغیرها در JavaScript را میتوان با «کلیدواژه»ی const، let یا var تعریف کرد.
یک متغیر هنگام استفاده از let یا var میتواند در طول عمرش به مقدارهای متفاوتی اشاره کند. برای مثال، myFirstVariable را میتوان با عملگر انتساب = بارها تعریف و بازتعریف کرد:
let myFirstVariable = 1;
myFirstVariable = 'Some string';
myFirstVariable = new SomeComplexClass();
برخلاف let و var، متغیرهایی که با const تعریف میشوند فقط یک بار میتوانند مقدار بگیرند. از این ویژگی برای تعریف ثابتها در JavaScript استفاده میشود.
const MY_FIRST_CONSTANT = 10;
// Can not be re-assigned.
MY_FIRST_CONSTANT = 20;
// => TypeError: Assignment to constant variable.
کلیدواژهی const هم برای متغیرها و هم برای ثابتها به کار میرود. مفهوم دیگری که در کنار ثابتها زیاد مطرح میشود (نا)تغییرپذیری است.
کلیدواژهی const فقط اتصال را تغییرناپذیر میکند، یعنی به یک متغیر const فقط یک بار میتوان مقدار انتساب داد. در JavaScript تنها مقدارهای اولیه تغییرناپذیرند. با این حال، مقدارهای غیراولیه هنوز میتوانند تغییر کنند.
const MY_MUTABLE_VALUE_CONSTANT = { food: 'apple' };
// This is possible
MY_MUTABLE_VALUE_CONSTANT.food = 'pear';
MY_MUTABLE_VALUE_CONSTANT;
// => { food: "pear" }
به عنوان یک قاعده، در Exercism و بسیاری از سازمانها و راهنماهای سبک پروژهها، مقدارهایی را که به شکل const SCREAMING_SNAKE_CASE هستند تغییر ندهید. از نظر فنی میتوان این مقدارها را تغییر داد، اما برای شفافیت و مدیریت انتظارها در Exercism این کار توصیه نمیشود. وقتی باید این کار اعمال شود، از Object.freeze(value) استفاده کنید.
const MY_VALUE_CONSTANT = Object.freeze({ food: 'apple' });
// This silently fails
MY_VALUE_CONSTANT.food = 'pear';
MY_VALUE_CONSTANT;
// => { food: "apple" }
در عمل، بعید است Object.freeze را در سراسر یک کدبیس ببینید، اما این قاعده که هرگز مقدار SCREAMING_SNAKE_CASE را تغییر ندهید قاعدهی خوبی است و اغلب با تحلیل خودکار مانند linter اعمال میشود.
در JavaScript، واحدهای کارکرد در توابع کپسوله میشوند و معمولاً اگر توابع به هم مربوط باشند در یک فایل کنار هم قرار میگیرند. این توابع میتوانند پارامتر (آرگومان) بگیرند و با کلیدواژهی return مقداری را برگردانند. توابع با نحوهی نگارش () فراخوانی میشوند.
function add(num1, num2) {
return num1 + num2;
}
add(1, 3);
// => 4
💡 در JavaScript راههای متفاوت زیادی برای اعلان یک تابع وجود دارد. این راههای دیگر با استفاده از کلیدواژهی
functionمتفاوت به نظر میرسند. این ترک تلاش میکند آنها را به تدریج معرفی کند، اما اگر از قبل با آنها آشنا هستید، راحت باشید و از هر کدامشان استفاده کنید. در بیشتر موارد، استفاده از یکی یا دیگری بهتر یا بدتر نیست.
کلیدواژههای export و import ابزارهای قدرتمندی هستند که یک فایل معمولی JavaScript را به یک ماژول JavaScript تبدیل میکنند. علاوه بر اینکه به کد اجازه میدهند اجزایی مانند توابع، کلاسها، متغیرها و ثابتها را به صورت انتخابی در معرض دید بگذارد، طیف کاملی از ویژگیهای دیگر را نیز ممکن میکنند، از جمله:
یک مثال عینی نحوهی کار تستها در ترک JavaScript در Exercism است. هر تمرین دستکم یک فایل پیادهسازی دارد، مثلاً lasagna.js، و هر تمرین دستکم یک فایل تست دارد، مثلاً lasagna.spec.js. فایل پیادهسازی از export برای در معرض دید گذاشتن API عمومی استفاده میکند و فایل تست از import برای دسترسی به آنها استفاده میکند و به این ترتیب میتواند نتایج پیادهسازی را بیازماید.
// file.js
export const MY_VALUE = 10;
export function add(num1, num2) {
return num1 + num2;
}
// file.spec.js
import { MY_VALUE, add } from './file';
add(MY_VALUE, 5);
// => 15