متغیرهای جاوااسکریپت Variable

آخرین به روزرسانی در 31 خرداد 1402
نوشته شده توسط علی خادم
متغیرهای جاوااسکریپت

متغیر چیه؟

توی جاوااسکریپت، برای ذخیره کردن اطلاعات، از متغیرهای جاوااسکریپت استفاده می‌کنیم. چه زمانی نیاز هست که اطلاعات رو ذخیره کنیم؟ هر وقت نیاز داشته باشیم تا یه «مقدار» یا value رو چند جای مختلف استفاده کنیم. کار کردن با متغیرها باعث می‌شه سایرین راحت‌تر کد شما رو متوجه بشن و در اصطلاح، کد شما «خواناتر» می‌شه.

چطوری یه متغیر تعریف کنیم؟

اگه بخوایم یه متغیر تعریف کنیم، باید از یکی از کلیدواژه‌های let یا const استفاده کنیم و بعد برای اون متغیر یه اسم انتخاب کنیم؛ از کلیدواژه const وقتی استفاده می‌کنیم که نیاز به یه مقدار ثابت داشته‌باشیم و از let زمانی استفاده می‌کنیم که مقدارمون متغیر باشه؛ توی این دوره نمی‌خوام خیلی عمیق وارد تفاوت‌های const و let بشم ولی درباره انتخاب کردن اسم متغیرها یه سری قواعد هست که باید همین جا یاد بگیرید:

  • اسمی که انتخاب می‌کنید باید معنی‌دار باشه
  • اسمی که انتخاب می‌کنید نباید با عدد شروع بشه
  • بین کلماتی که برای اسم متغیر انتخاب می‌کنید نباید فاصله باشه
  • برای انتخاب کردن اسم‌ها، توی جاوااسکریپت از یه جور استاندارد املایی استفاده می‌شه که بهش می‌گن نگارشِ شُتُری یا camelCase؛ این طوریه که کلمه اول با حرف کوچیک شروع می‌شه و از کلمه دوم به بعد، کلمات با حرف بزرگ شروع می‌شن و به همدیگه می‌چسبن؛ توی مثال بعدی می‌بینید که متغیرهای windowWidth و windowHeight با رعایت کردن همین استاندارد نوشته شدن (رعایت این استاندارد اجباری نیست اما شدیداً توصیه می‌شه از این روش برای نوشتن اسامی استفاده بشه)

استفاده از متغیرهای جاوااسکریپت توی p5.js

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

function setup() {
     createCanvas(windowWidth, windowHeight)
}
function draw() {
     if(mouseIsPressed) {
          fill(0)
     } else {
          fill(255)
     }

     // this is a variable, you can change circle size here
     const circleSize = 80

     ellipse(mouseX, mouseY, circleSize, circleSize)
}

بعد از این که فایل index.html رو توی مرورگر باز کردید، عدد متغیر circleSize رو تغییر بدید، فایل رو ذخیره کنید و صفحه مرورگرو رفرش کنید. می‌بینید که هم عرض و هم ارتفاع دایره فقط با تغییر دادن یه متغیر، عوض می‌شه.

متغیر ازپیش‌تعریف‌شده

توی setup موقع اجرا کردن تابع createCanvas از دو تا متغیر از پیش‌تعریف‌شده‌ی windowWidth و windowHeight استفاده کردیم که به ترتیب عرض و ارتفاع صفحه مرورگرو بهمون می‌ده؛ این دو تا متغیر رو ما تعریف نکردیم و از متغیرهای پیش‌فرض p5.js هستن. پس p5.js شامل تعدادی متغیر ازپیش‌تعریف‌شده‌س که کاربردهای مختلفی دارن. حالا یه اسکیس دیگه انجام بدیم. این دفعه می‌خوام یه دایره وسط تصویر بکشم و وسطش یه مستطیل درست کنم:

function setup() {

     // general
     createCanvas(windowWidth, windowHeight)
     background(1, 186, 240)
     noStroke()

}
function draw() {

     // circle
     const circleSize = 200
     fill(237, 35, 93)
     ellipse(windowWidth / 2, windowHeight / 2, circleSize, circleSize)

     // rectangle
     const rectWidth = 150
     const rectHeight = 30
     fill(255)
     rect(windowWidth / 2 - rectWidth / 2, windowHeight / 2 - rectHeight / 2, rectWidth, rectHeight)

}

این مثال یه خرده نیاز به توضیح داره. من کد رو به سه قسمت تقسیم کردم:

بخش اول که با کامنت general مشخص شده تنظیمات عمومی صفحه‌س؛ این جا با تابع background مشخص کردم که رنگ پس‌زمینه چی باشه و همچنین با استفاده از تابع noStroke مشخص کردم که اَشکالی که قراره بعد از این به نمایش دربیاد دورخط یا استروک نداشته باشه.

بخش دوم که با کامنت circle مشخص شده شامل یه متغیره که اندازه دایره توش تعریف شده. بعد هم از تابع fill استفاده کردم که به دایره رنگ بدم. بعد خود دایره کشیده شده. برای این که دایره دقیقاً وسط صفحه قرار بگیره عرض و ارتفاع صفحه رو تقسیم بر دو کردم.

بخش سوم که با کامنت rectangle مشخص شده هم شامل دو تا متغیره که عرض و ارتفاع مستطیل رو مشخص می‌کنه؛ این جا هم از fill استفاده کردم برای مشخص کردن رنگ مستطیل. اگه دقت کنید مجبور شدم عرض و ارتفاع مستطیل رو تقسیم بر دو کنم تا مستطیل وسط دایره قرار بگیره.

با استفاده از متغیرهای جاوااسکریپت یه علامت راهنمایی و رانندگی ساختیم!

توی این مثال دیدید که من متغیرها رو توی تابع draw ساختم و توی همون تابع هم استفاده کردم. ممکنه این سؤال توی ذهنتون به وجود بیاد که اگه این متغیرها توی تابع setup ساخته می‌شدن چی می‌شد؟ جواب اینه که برنامه با خطا مواجه می‌شد و درست اجرا نمی‌شد؛ این به خاطر اینه که توی جاوااسکریپت، اگه یه متغیر داخل یه تابع ساخته بشه، فقط داخل همون تابع می‌شه ازش استفاده کرد. پس برنامه پایین با خطا مواجه می‌شه:

function setup() {

     // general
     createCanvas(windowWidth, windowHeight)
     background(1, 186, 240)
     noStroke()

     // variables
     const circleSize = 200
     const rectWidth = 150
     const rectHeight = 30

}
function draw() {

     // circle
     fill(237, 35, 93)
     ellipse(windowWidth/2, windowHeight/2, circleSize, circleSize)

     // rectangle
     fill(255)
     rect(windowWidth/2 - rectWidth/2, windowHeight/2 - rectHeight/2, rectWidth, rectHeight)

}

اما اگه نیاز باشه، می‌تونیم متغیرها رو بیرون تابع draw و قبل از تابع setup بسازیم و توی هر تابعی که خواستیم ازشون استفاده کنیم. این طوری برنامه به مشکلی نمی‌خوره؛ به این متغیرها می‌گن متغیرهای عمومی؛ یعنی منحصر به هیچ تابعی نیستن و هر جایی قابل استفاده هستن.

// variables
const circleSize = 200
const rectWidth = 150
const rectHeight = 30

function setup() {
     createCanvas(windowWidth, windowHeight)
     background(1, 186, 240)
     noStroke()
}
function draw() {

     // circle
     fill(237, 35, 93)
     ellipse(windowWidth/2, windowHeight/2, circleSize, circleSize)

     // rectangle
     fill(255)
     rect(windowWidth/2 - rectWidth/2, windowHeight/2 - rectHeight/2, rectWidth, rectHeight)

}

چه چیزهایی رو می‌شه توی متغیرهای جاوااسکریپت ذخیره کرد؟ «انواعِ داده»

توی مثال‌هایی که تا الان دیدید، فقط اعداد رو داخل متغیرها ذخیره کردیم. در واقع تنها «نوع داده‌»ای که تا الان داخل متغیرهای جاوااسکریپت ذخیره کردیم، اعداد بودن. جاوااسکریپت هشت نوع داده یا دیتا تایپ داره که می‌شه اون‌ها رو توی متغیرها ذخیره و بعد ازشون استفاده کرد؛ اون هشت نوع داده اینا هستن:

  • عدد ـ Number ـ ممکنه عدد صحیح یا اعشاری باشه
  • استرینگ ـ String ـ همون متنه و بین کوتیشن‌مارک یا بک‌تیک قرار می‌گیره
  • بولیَن ـ Boolean ـ یعنی true یا false (صحیح یا غلط)
  • نال ـ Null ـ مقدارِ خالی
  • تعریف‌نشده ـ Undefined ـ متغیر تعریف شده ولی هیچ مقداری نداره
  • آرایه ـ Array ـ فهرستی از داده‌ها
  • تابع ـ Function
  • آبجکت ـ Object

شش تای اول از این هشت تا رو خیلی خلاصه الان توضیح می‌دم، دو تای دیگه که پیچیده‌تر هستن رو توی یادداشت‌های بعدی کامل یاد می‌گیریم.

اول: عدد

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

const firstNumber = 5
const secondNumber = 10

console.log(firstNumber + secondNumber)
// 15

این البته خیلی مثال ساده‌ایه. توی جاوااسکریپت یه آبجکتی داریم که بهش می‌گیم Math که به معنی ریاضیه و بهمون امکانات زیادی می‌ده که بتونیم با اعداد کارای مختلفی انجام بدیم. توی مثال پایین ببینید که با مِتُدهای مربوط به آبجکت Math چطوری اعداد رو به سمت بالا یا پایین رُند می‌کنیم و یا از بین مجموعه اعداد، عدد کمینه یا بیشنه رو مشخص می‌کنیم:

console.log(PI) 
// 3.141592653589793

console.log(Math.round(PI)) 
// 3, to round values to the nearest number

console.log(Math.round(9.81)) 
// 10

console.log(Math.floor(PI)) 
// 3, rounding down

console.log(Math.ceil(PI)) 
// 4, rounding up

console.log(Math.min(-5, 3, 20, 4, 5, 10)) 
// -5, returns the minimum value

console.log(Math.max(-5, 3, 20, 4, 5, 10)) 
// 20, returns the maximum value

به اون عبارتی که بعد از آبجکت Math نوشتیم می‌گن مِتُدِ مربوط به اون آبجکت. مِتُدهای مربوط به آبجکت Math خیلی زیادن و برای هر عملیات ریاضی که از ذهنتون بگذره، جاوااسکریپت یه مِتُدِ آماده داره؛ من نمی‌خوام همه این مِتُدها رو بررسی کنم یا توضیح بدم چون خیلی زیاد هستن و واقعاً بیشترشون تا حالا به کارم نیومده، فقط یادتون باشه که برای هر جور عملیات ریاضی که فک کنید یه مِتُدی وجود داره و این متدها محدود به استفاده در p5.js نیستن، بلکه توی هر محیطی که بشه توش جاوااسکریپت نوشت قابل استفاده هستن.

دوم: استرینگ

استرینگ همون متنه و بین کوتیشن‌مارک یا علامت نقل‌قول نوشته می‌شه. فرض کنید می‌خوایم استرینگ‌های مختلف رو به همدیگه متصل کنیم و به صورت یک متن واحد نمایش بدیم؛ برای این کار از علامت + استفاده می‌کنیم و متغیرها رو بین متن قرار می‌دیم:

const space = ' '
const firstName = 'Ali'
const country = 'Iran'
const city = 'Tehran'
const language = 'JavaScript'
const age = 33
const personInfo = 'Hi!' + space + 'My name is' + space + firstName

console.log(personInfo)
// Hi! My name is Ali

البته برای این کار یه روش دیگه هم وجود داره که به نظر من روش بهتریه که بهش می‌گن «درج در استرینگ» یا به انگلیسی String Interpolation؛ توی این روش دیگه از علامتِ + استفاده نمی‌شه و به جاش برای نمایش متغیرها از علامت $ استفاده می‌شه و بعد اسم متغیر توی براکت قرار می‌گیره؛ ضمناً کل استرینگ بین دو تا علامت بک‌تیک قرار می‌گیره. علامت بک‌تیک این علامته: ` و توی صفحه کلید من سمت چپ عدد یک قرار داره. پس اگه بخوایم خلاصه کنیم، توی روش درج در استرینگ:

  • قبل از متغیرها از علامت دلار استفاده می‌شه
  • متغیرها داخل براکت قرار می‌گیرن
  • کل استرینگ داخل علامت بک‌تیک نوشته می‌شه
const firstName = 'Ali'
const country = 'Iran'
const city = 'Tehran'
const language = 'JavaScript'
const age = 33
const personInfo = `Hi! My name is ${firstName} and I live in ${city}`

console.log(personInfo)
// Hi! My name is Ali and I live in Tehran

سوم: بولیَن

بولیَن نوعی از داده‌س که می‌تونه true یا false باشه (توی یادداشت قبلی خیلی مختصر بهش اشاره کردم)؛ یعنی یا درسته یا غلطه؛ خیلی ساده‌س و جلوتر که درباره مقایسه و منطق شرطی یاد بگیرید متوجه می‌شید که چقدر کاربردیه. فعلاً فقط بدونید هر وقت عمل مقایسه انجام بدیم، در واقع داریم یه بولیَن می‌سازیم که ممکنه true یا false باشه. خودتون می‌تونید یه سری مقایسه انجام بدید و نتیجه رو توی کنسول نگاه کنید:

console.log(4 > 3) 
// true

console.log(3 > 4) 
// false

console.log(3 == 3) 
// true

توی مثالی که اول همین درس داشتیم از متغیر mouseIsPressed استفاده کردیم؛ این متغیر یه بولیَنه و از متغیرهای پیش‌فرض p5.js هم هست، وقتی دکمه ماوس فشار داده بشه true و در غیر این صورت false می‌شه.

function setup() {
     createCanvas(windowWidth, windowHeight)
}
function draw() {
     if(mouseIsPressed) {
          fill(0)
     } else {
          fill(255)
     }

     // this is a variable, you can change circle size here
     const circleSize = 80

     ellipse(mouseX, mouseY, circleSize, circleSize)
}

چهارم: نال

نال یعنی تُهی، یعنی هیچ. متغیر نال متغیریه که خالیه و هیچ چیزی توش نیست؛ دقت کنید که این هم‌معنی با عدد صفر نیست، چون عدد صفر یه عدده ولی نال هیچ چی نیست؛ همچنین این یه متغیر تعریف‌نشده نیست.

const empty = null

console.log(empty) 
// null

پنجم: تعریف‌نشده

اگه یه متغیر بسازید ولی هیچ مقداری بهش نسبت ندید، مقدار اون متغیر undefined یا تعریف‌نشده می‌شه.

let firstName

console.log(firstName) 
// undefined

نکته خیلی مهم توی مثال بالا اینه که برای ساختن متغیر توی مثال بالا دیگه از const استفاده نکردم؛ چون توی جاوااسکریپت وقتی با کلیدواژه const یه متغیر می‌سازید باید حتماً مقدار اون متغیر رو هم تعریف کنید؛ در غیر این صورت با خطا مواجه می‌شید؛ این در حالیه که متغیرهایی که با let ساخته می‌شن، می‌تونن ابتدا مقداری نداشته باشن و مقدار اون‌ها بعداً مشخص بشه.

ششم: آرایه

آرایه‌ها در واقع فهرستی از داده‌ها هستن که با علامت , از همدیگه جدا شدن و می‌تونن شامل هر نوعِ داده‌ی دیگه‌ای باشن. اگه لازم باشه با مجموعه‌ای از داده‌ها کار کنیم، مثلاْ مجموعه‌ای از کلمات، باید از یه آرایه استفاده کنیم. با استفاده از علامت‌های [] که بهش می‌گیم براکت، می‌شه یه آرایه تعریف کرد و ازش استفاده کرد:

const words = ['this', 'is', 'a', 'simple', 'array']

console.log(words[0])
// this

console.log(words[3])
// simple

console.log(words.length)
// 5 

آرایه‌های جاوااسکریپت zero-base هستن؛ یعنی وقتی محتوای آرایه شماره‌گذاری می‌شن، شماره‌گذاری از صفر شروع می‌شه؛ برای همینه که توی مثال بالا وقتی خواستیم به اولین موردِ آرایه دسترسی پیدا کنیم از words[0] استفاده کردیم. همچنین از متُدِ length استفاده کردیم تا تعداد موارد داخل آرایه رو به دست بیاریم؛ متُدهای دیگه هم هستن که برای کار کردن با آرایه‌ها وجود داره. مثلاً متُد push یک آیتم یا مقدار به انتهای آرایه اضافه می‌کنه:

let words = ['this', 'is', 'a', 'simple', 'array']
words.push('apple')

console.log(words[5])
// apple

خب، این از شش تا انواعِ داده، می‌مونه «تابع» و «آبجکت» که بعداً قراره حسابی درباره‌شون یاد بگیریم.

چک کردن انواع داده

بعضی وقتا نیاز داریم ببینیم چه نوع داده‌ای توی یه متغیر ذخیره شده؛ برای این کار از مِتُدِ typeof استفاده می‌کنیم:

const firstName = 'Ali'
const age = 33
let job

console.log(typeof firstName) 
// string

console.log(typeof age)
// number

console.log(typeof job) 
// undefined, because a value was not assigned

یه خُرده ریاضی

خبر خوب اینه که پروژه‌های جاوااسکریپت معمولاً ریاضیات خیلی پیچیده‌ای ندارن و با اعمال خیلی ساده ریاضی سر و کار دارن (مگه این که پروژه خاصی باشه). خیلیا فک می‌کنن برای این که برنامه‌نویس خوبی بشن حتماً باید خیلی ریاضی بلد باشن. البته که دانش ریاضی خیلی وقتا توی کدنویسی به داد آدم می‌رسه، اما تجربه نشون داده که بیشتر وقتا اعمال خیلی ساده ریاضی هستن که توی پروژه‌ها کاربرد دارن. علامت‌های ساده‌ای مثل به‌علاوه، منها و ستاره وقتی بین اعداد (یا متغیرهای شامل اعداد) قرار بگیرن، اعمال ریاضی رو بین اون اعداد انجام می‌دن. با این علامت‌هایی که این زیر لیست کردم می‌تونیم روی اعداد، اعمال ساده ریاضی انجام بدیم. توی مثال بعدی می‌تونید اعداد رو به دلخواه خودتون تغییر بدید و نتیجه هر کدوم از اعمال ریاضی رو توی کنسول مرورگرتون ببینید.

  • جمع: +
  • تفریق: -
  • ضرب: *
  • تقسیم: /
  • باقی‌مانده: %
  • توان: **
const numOne = 5
const numTwo = 3
const sum = numOne + numTwo
const diff = numOne - numTwo
const mult = numOne * numTwo
const div = numOne / numTwo
const remainder = numOne % numTwo
const powerOf = numOne ** numTwo

console.log(sum)
console.log(diff)
console.log(mult)
console.log(div)
console.log(remainder)
console.log(powerOf)

جاوااسکریپت قوانینی داره که مشخص می‌کنه انجام کدوم اعمال ریاضی نسبت به سایر اعمال اولویت داره. یعنی کدوم محاسبات اول انجام می‌شه، کدوم محاسبات دوم، کدوم سوم و الی آخر؛ این اطلاعات به شما کمک می‌کنه بفهمید یه چنین کدی چطوری کار می‌کنه:

const x = 4 + 4 * 5
// 24

توی مثال بالا، اول 4 * 5 محاسبه می‌شه چون عمل ضرب بالاترین اولیت رو داره. بعد 4 به حاصل ضرب 4 * 5 اضافه می‌شه و نتیجه 24 به دست میاد. اگه دوست داشته باشید می‌تونید برنامه رو مجبور کنید که عمل جمع رو اول انجام بده؛ کافیه عمل جمعی که مد نظرتونه رو ببرید داخل یه جفت پرانتز. اعمال داخل پرانتز همیشه اولویت بالاتری نسبت به اعمال خارج از پرانتز دارن:

const x = (4 + 4) * 5
// 40

توی برنامه‌نویسی بعضی از محاسبات این قدر زیاد تکرار می‌شن که براشون یه میان‌برهایی طراحی شده. مثلاً اضافه کردن عدد 1 به یه متغیر با علامت ++ انجام می‌شه، یا کم کردن عدد 1 از یه متغیر با علامت -- به راحتی انجام می‌شه:

x++
y--

p5.js هم تابع‌های آماده‌ای داره که خیلی از عملیات‌های ریاضی رو برامون ساده‌تر می‌کنه. مثلاً رُند کردن اعداد با تابع round انجام می‌شه، با تابع random می‌شه یه عدد تصادفی توی بازه‌ای که مشخص می‌کنید، بسازید و با تابع cos می‌تونید کسینوس یه زاویه رو به دست بیارید.

const roundedValue = round(2.67)
// 3

const randomValue = random(-5, 5)
// a random number between -5 and 5

const cosineValue = cos(angle)
// calculates the cosine 

مقایسه در جاوااسکریپت

خیلی وقتا پیش میاد که لازمه مقادیری رو با همدیگه مقایسه کنیم، برای این کار باید از علامت‌های مربوط به مقایسه استفاده کنیم. می‌تونیم مقایسه کنیم که یه مقدار با یه مقدار دیگه برابره، یا مثلاً ازش کوچکتر یا بزرگتره.

  • فقط مقدار، برابر: ==
  • هم مقدار و هم نوع داده، برابر: ===
  • نابرابر: =!
  • بزرگتر از: >
  • کوچکتر از: <
  • بزرگتر یا مساوی: >=
  • کوچکتر یا مساوی: <=
console.log(3 > 2) // true
console.log(3 >= 2) // true
console.log(3 < 2) // false
console.log(2 < 3) // true
console.log(2 <= 3) // true
console.log(3 == 2) // false
console.log(3 != 2) // true

console.log(3 == '3') // true, compare only value
console.log(3 === '3') // false, compare both value and data type
console.log(3 !== '3') // true, compare both value and data type
console.log(3 != 3) // false, compare only value
console.log(3 !== 3) // false, compare both value and data type
  • علامت آمپرسَند ـ && ـ همه شروط درست باشن
  • علامت پایپ ـ || ـ یکی از شروط درست باشه
  • علامتِ نفی ـ ! ـ تبدیل درست به غلط و غلط به درست
// && ampersand
const check1 = 4 > 3 && 10 > 5 // true
const check2 = 4 > 3 && 10 < 5 // true
const check3 = 4 < 3 && 10 < 5 // false

// || pipe
const check4 = 4 > 3 || 10 > 5 // true
const check5 = 4 > 3 || 10 < 5 // true
const check6 = 4 < 3 || 10 < 5 // false

// ! negation
const check7 = 4 > 3 // true
const check8 = !(4 > 3) // false
const isLightOn = true
const isLightOff = !isLightOn // false
const isMarried = !false // true

شرط

خیلی وقتا نیاز داریم توی برنامه‌مون یه شرط بنویسیم؛ یعنی اگه یه چیزی true بود برنامه یه کاری برامون انجام بده و اگه false بود یه کار دیگه انجام بده؛ برای این کار می‌تونیم از کلیدواژه if استفاده کنیم و داخل پرانتز شرط رو بنویسیم، شرط می‌تونه شامل یه متغیر بولین باشه یا یه مقایسه (که باز هم در نهایت نتیجه‌ش یه بولیَنه)؛ بعد هم باید داخل {} بنویسیم که اگه شرط صادق بود چه اتفاقی قراره بیفته. اول همین صفحه، اولین مثالی که انجام دادیم شامل یه شرط بود. دقت کنید که چطور از if و else استفاده شده:

if(mouseIsPressed) {
     fill(0)
} else {
     fill(255)
}

ارسال نظر

ایمیل شما منتشر نخواهد شد. بخش‌های ضروری با * مشخص شده‌اند.