تفاوت var و let و const در جاوا اسکریپت

پیش نیاز ها : (این مقاله ها رو قبل خوندن این پست مطالعه کنین)

متغیر ها رو می تونیم به چند صورت تعریف کنیم ، با استفاده از :

  • var
  • let
  • const
  • Without declaring (بدون دکلار کردن)

ساختن متغیر بدون دکلار کردن :

تنها استفاده این نوع تعریف کردن متغیر، استفاده در فانکشن هاست.

این نوع متغیر ها تنها نوعی هستند که می تونن در function scope تعریف بشن و همینطور در global scope بشه ازشون استفاده کرد.

function name(){
  x = 10;
}
name();
console.log(x);


نکته : حتما باید تابع رو صدا بزنید تا متغیر تعریف بشه

اما

اگر strict mode فعال باشه حتما باید متغیر ها رو با استفاده از var , const یا letاستفاده کنید و نمی تونین به این شکل تعریف کنین

تفاوت var با let :

اگر تفاوت این دو تا رو یاد بگیرین تفاوت const با var هم یاد می گیرید.
Let و const فقط یک تفاوت دارن

متغیر هایی که با var تعریف میشن ویژگی هایی داره که let نداره :

Hoisting :

فقط و فقط این قابلیت رو var داره ،این ویژگی باعث میشه که متغیر هایی که دکلار میشن به بالا ترین خط اسکوپ خودشون برن ، به عبارتی شما می تونین یه متغیر رو تعریف کنین قبل از این که دکلارش کنین

function run() {
console.log(foo); // undefined
var foo = &quotFoo&quot
console.log(foo); // Foo
}
run();

اما حالا با let تست کنیم :

function run() {
console.log(foo); // RefrenceError
let foo = &quotFoo&quot
console.log(foo); // Foo
}
run();

Block scope :

وقتی یک متغیر رو با var داخل block scope دکلار کنیم اون متغیر به صورت گلوبال ذخیره میشه ولی اگر با let دکلار بشه ، اون متغیر توی block scope ذخیره میشه


{
var n1 = 5;
let n2 = 6;
}
console.log(n1) //5
console.log(n2) //RefrenceError

Global object :

وقتی ما میگیم یه متغیر گلوباله یعنی اون متغیر توی global execution contextذخیره شده و هر دوی متغیر های let , var توی گلوبال اسکوپ ، در global execution contextذخیره میشن

ولی Global object با global execution context فرق داره ، گلوبال آبجکت همون window یا globalThis (در commad line node)

متغیر let به عنوان یه property داخل گلوبال آبجکت ذخیره نمیشه ولی var میشه

var a = 2;
console.log(window.a) // 2
let b = 3;
console.log(window.b) //undefined

Redeclaration :

فقط var قابلیت redeclaration داره و letنداره (redeclaration به معنای مجددا دکلار کردن یه متغیره)

var foo = &quotfoo1&quot
var foo = &quotfoo2&quot // OK
let bar = &quotbar1&quot
let bar = &quotbar2&quot // SyntaxError

سوال : وقتی let هیچکدوم از قابلیت هایی که varداره رو نداره برای چی ازش استفاده کنیم؟

این باعث میشه که مقدار کمتری از حافظه برنامه استفاده بشه و در مواقعی باعث جلوگیری از ساخت متغیر گلوبال اضافه میشه!


خب گفتیم let و const فقط یک تفاوت دارن :

Reassignable :

متغیر هایی که با const ساخته میشن این ویژگی رو دارن که باعث میشه نتونیم مقدار اون ها رو عوض کنیم

const v = “a”;
v = “b”; // TypeError
نکته : در object ها می تونیم مقدار property ها رو عوض کنیم ولی نمی تونیم object رو دوباره assignکنیم
const obj = {type : 'string'}
obj = {type : 'number'} // TypeError
obj.type = 'number'; //OK

با آرزوی موفقیت :))

-انتشارات توسعه دهندگان وب-