Perbedaan var, let, dan const pada ES6
Var
var x; // deklarasi
x = 1; // assignment
// atauvar x = 1; // deklarasi dan assignment dalam satu baris{codeBox}
var foo = 'hello1';var foo = 'hello2';console.log(foo); // Output: hello2{codeBox}
x = 10;var x;console.log(x); // Output: 10{codeBox}
Pada contoh di atas, variabel "x" dideklarasikan setelah variabel tersebut sudah diberi nilai. Namun, ketika kode dijalankan, variabel "x" diangkat ke atas sebelum baris kode dijalankan, sehingga nilai yang diberikan pada variabel "x" dapat ditampilkan dengan benar.
Namun, penggunaan "hoisting" dapat membuat kode sulit dibaca dan membingungkan. Selain itu, hoisting juga dapat menyebabkan variabel yang belum dideklarasikan menghasilkan nilai "undefined", yang bisa menjadi masalah ketika programmer tidak sengaja mengacu pada variabel yang belum dideklarasikan. Oleh karena itu, sebaiknya hindari penggunaan "hoisting" dan deklarasikan variabel dengan benar sebelum digunakan.
var b=2
if (true){
var b=3
}console.log(b); // Output: 3{codeBox}
Variabel var ternyata menjadi variabel global, meskipun ada di dalam scope. Sebelum ES6, solusinya adalah membuatnya dalam function scope.
var b=2
function myScope(){
var b=3
}
myScope()console.log(b); // Output: 2{codeBox}
Atau bisa dipersingkat dengan anonymous IIFE (Immediately Invoke Function Expression).
var b=2
(function(){
var c=3
})()console.log(b); // Output: 2{codeBox}
Let
Cara kerja let hampir sama dengan var, namun perbedaannya terletak pada scope-nya.
Variabel yang dideklarasikan dengan var memiliki scope yang terbatas pada fungsi tempat variabel tersebut dideklarasikan, sedangkan variabel yang dideklarasikan dengan let memiliki scope yang terbatas pada blok tempat variabel tersebut dideklarasikan (misalnya, blok if atau loop for). Anda dapat merujuk pada tabel di atas untuk melihat perbedaan scope antara var dan let.
let foo ='hello1'let foo ='hello' //=> SyntaxError: Identifier 'foo' has already been declared{codeBox}
Dalam contoh ini, let tidak mengizinkan duplikasi deklarasi variabel foo dan menghasilkan SyntaxError. Ini membantu Anda menghindari bug yang tidak terduga karena reassign variabel.
let xx = 10console.log(10); // Output: 10{codeBox}
Pada contoh ini, variabel x dideklarasikan terlebih dahulu sebelum diassign nilai 10 dan diakses di console.log. Ini karena variabel let tidak mengalami hoisting seperti variabel var.
let b=2if (true){let b=3}console.log(b) //=> 2{codeBox}
Dalam contoh ini, variabel b dideklarasikan terlebih dahulu di luar blok if dengan nilai 2, dan kemudian variabel b dideklarasikan kembali di dalam blok if dengan nilai 3. Namun, karena variabel b di dalam blok if memiliki scope yang terbatas hanya pada blok tersebut, maka saat diakses di luar blok if, nilai variabel b yang digunakan adalah nilai variabel b yang di deklarasikan di luar blok if.
menggunakan let tidak akan membantu karena variabel tanpa deklarasi dianggap sebagai variabel var. Oleh karena itu, sebagai seorang coder, Anda perlu berhati-hati dalam membuat variabel dan selalu mendeklarasikan variabel sebelum menggunakannya.
Const
Const atau Konstanta, dari namanya bisa di tebak. Variabel yang sifatnya tetap atau dengan kata lain nama dan isi dari variabel tidak bisa di ubah
const KEY=123
KEY = 456 //=> TypeError: Assignment to constant variable.
{codeBox}
Dalam contoh ini, variabel KEY dideklarasikan dengan nilai 123 sebagai konstanta. Ketika kita mencoba mengubah nilainya dengan meng-assign nilai baru 456, maka akan menghasilkan TypeError.
Namun, ketika variabel const berisi objek atau array, sifat konstan tersebut hanya berlaku pada variabel itu sendiri, bukan pada nilai-nilai di dalamnya. Artinya, Anda masih dapat mengubah nilai-nilai di dalam objek atau array tersebut, tetapi Anda tidak dapat mengubah variabel itu sendiri menjadi mengacu pada objek atau array yang berbeda. Contohnya:
const myObj = {name: 'John', age: 30}
myObj.age = 40 // Tidak ada TypeError, nilai age di dalam objek diubah menjadi 40
myObj = {name: 'Jane', age: 25} // TypeError: Assignment to constant variable.
{codeBox}
Dalam contoh ini, kita dapat mengubah nilai age di dalam objek myObj, tetapi ketika kita mencoba mengubah variabel myObj menjadi mengacu pada objek yang berbeda, maka akan menghasilkan TypeError.
ketika kita mendeklarasikan variabel dengan const, nilai dari variabel tersebut tidak dapat diubah setelah dideklarasikan. Namun, jika variabel const berisi objek atau array, sifat konstan tersebut hanya berlaku pada variabel itu sendiri, bukan pada nilai-nilai di dalamnya. Artinya, kita masih dapat mengubah nilai-nilai di dalam objek atau array tersebut.
Contohnya, ketika kita membuat variabel const obj yang berisi objek dengan property id dan name, kita masih dapat menambahkan property baru seperti location dan mengubah nilai dari property yang sudah ada seperti name:
const obj = { id:1, name:'jhon'}
obj.location="medan"
console.log(obj) //=> { id:1, name:'jhon',location:'medan'}
{codeBox}
Namun, ketika kita mencoba mengubah variabel obj menjadi mengacu pada objek yang berbeda, maka akan menghasilkan TypeError:
obj={} //=> TypeError: Assignment to constant variable.
{codeBox}
Hal yang sama berlaku untuk variabel const yang berisi array. Kita masih dapat menambahkan elemen baru ke dalam array, tetapi ketika kita mencoba mengubah variabel array menjadi mengacu pada array yang berbeda, maka akan menghasilkan TypeError:
const arr=[1,2,3,4]
arr.push(5)
console.log(arr) //=> [1,2,3,4,5]
arr=[] //=> TypeError: Assignment to constant variable.
{codeBox}
Jadi, perlu diingat bahwa variabel const memang tidak bisa di-assign ulang, tetapi nilai dan property dalam objek dan array yang di-assign ke variabel const masih dapat diubah karena sifatnya yang mutable.