Const dalam JavaScript: kapan menggunakannya dan apakah perlu?


349

Baru-baru ini saya menemukan constkata kunci dalam JavaScript. Dari apa yang dapat saya katakan, ini digunakan untuk membuat variabel yang tidak dapat diubah , dan saya telah menguji untuk memastikan bahwa itu tidak dapat didefinisikan ulang (dalam Node.js):

const x = 'const';
const x = 'not-const';

// Will give an error: 'constant 'x' has already been defined'

Saya menyadari bahwa ini belum distandarisasi di semua browser - tapi saya hanya tertarik pada konteks Node.js V8 , dan saya perhatikan bahwa beberapa pengembang / proyek tampaknya sangat menyukainya ketika varkata kunci dapat digunakan untuk efek yang sama.

Jadi pertanyaan saya adalah:

  • Kapan pantas digunakan constdi tempat var?
  • Haruskah ini digunakan setiap kali variabel yang tidak akan ditugaskan kembali dinyatakan?
  • Apakah itu benar-benar membuat perbedaan jika vardigunakan sebagai pengganti constatau sebaliknya?

1
Itu tampaknya belum distandarisasi (mungkin di EC6?). Anda akan menemukan informasi tambahan tentang hal ini di sini: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Sebastien C.

1
Const memiliki kinerja yang buruk meskipun jsperf.com/const-vs-var-mod-3
Deepu

Jawaban:


462

Ada dua aspek dari pertanyaan Anda: apa saja aspek teknis dari penggunaan dan constbukan varapa yang terkait dengan aspek manusia dalam melakukannya.

Perbedaan teknisnya signifikan. Dalam bahasa yang dikompilasi, konstanta akan diganti pada waktu kompilasi dan penggunaannya akan memungkinkan untuk optimasi lain seperti penghapusan kode mati untuk lebih meningkatkan efisiensi runtime dari kode. Mesin JavaScript terbaru (istilah yang digunakan secara longgar) sebenarnya mengkompilasi kode JS untuk mendapatkan kinerja yang lebih baik, sehingga menggunakan kata kunci const akan memberi tahu mereka bahwa optimasi yang dijelaskan di atas adalah mungkin dan harus dilakukan. Ini menghasilkan kinerja yang lebih baik.

Aspek yang berhubungan dengan manusia adalah tentang semantik kata kunci. Variabel adalah struktur data yang berisi informasi yang diharapkan berubah. Konstanta adalah struktur data yang berisi informasi yang tidak akan pernah berubah. Jika ada ruang untuk kesalahan, varharus selalu digunakan. Namun, tidak semua informasi yang tidak pernah berubah dalam masa pakai program perlu dinyatakan const. Jika dalam keadaan yang berbeda informasi harus berubah, gunakan varuntuk menunjukkan itu, bahkan jika perubahan yang sebenarnya tidak muncul dalam kode Anda.


4
Salam, saya berasumsi bahwa Mozilla / Google tidak akan menambahkan dukungan const ke mesin JS tanpa alasan. Saya akan pastikan untuk menggunakan const jika ada.
axdg

6
constobjek tampaknya bisa berubah, jadi saya tidak yakin seberapa ketat kompiler JS sebenarnya. Mungkin mode "gunakan ketat" juga membuat perbedaan.
Rudie

9
@ Rudie Fitur yang Anda cari disebut pembekuan objek. consthanya mencegah penugasan kembali "variabel" ke nilai lain. const a = {}; a = {};akan melempar kesalahan dalam mode ketat.
Tibos

Saya menggunakan const secara umum alih-alih membiarkan untuk sebagian besar variabel, sama seperti di Jawa saya menambahkan final ke sebagian besar deklarasi variabel.
coding

2
If there is room for error, var should always be used. Hari ini hal ini tidak berlaku lagi, dengan alat seperti ESLint langsung menunjukkan constpelanggaran.
vitaly-t

72

Pembaruan 2017

Jawaban ini masih mendapat banyak perhatian. Perlu dicatat bahwa jawaban ini diposting kembali pada awal tahun 2014 dan banyak yang telah berubah sejak saat itu.dukungan sekarang menjadi norma. Semua browser modern sekarang mendukung constsehingga seharusnya cukup aman untuk digunakan tanpa masalah.


Jawaban Asli dari 2014

Meskipun memiliki dukungan browser yang lumayan , saya akan menghindari menggunakannya untuk saat ini. Dari artikel MDN diconst :

Implementasi const saat ini adalah ekstensi khusus Mozilla dan bukan bagian dari ECMAScript 5. Didukung oleh Firefox & Chrome (V8). Pada Safari 5.1.7 dan Opera 12.00, jika Anda mendefinisikan variabel dengan const di browser ini, Anda masih dapat mengubah nilainya nanti. Itu tidak didukung di Internet Explorer 6-10, tetapi termasuk dalam Internet Explorer 11. Kata kunci const saat ini menyatakan konstanta dalam lingkup fungsi (seperti variabel yang dideklarasikan dengan var).

Selanjutnya dikatakan:

constakan didefinisikan oleh ECMAScript 6, tetapi dengan semantik yang berbeda. Mirip dengan variabel yang dideklarasikan dengan pernyataan let, konstanta yang dideklarasikan dengan const akan dicekal.

Jika Anda menggunakannya, constAnda harus menambahkan solusi untuk mendukung browser yang sedikit lebih tua.


6
Jawaban bagus - walaupun saya sudah membaca artikel di MDN. Seperti yang saya katakan, saya lebih tertarik pada apakah V8 secara khusus benar-benar akan memperlakukan const secara berbeda ke var. Saya pikir @ Tibo menjelaskan hal itu.
axdg

James terima kasih telah menunjukkan aspek dukungan. karena semua jawaban javascript harus menyertakan rincian dukungan browser. menjelaskan dengan baik
hubson bropa

4
Catatan ES6 telah menerima pembekuan fitur pada Agustus 2014. Pada Juli 2015 standar ini secara resmi dirilis. Jika Anda membaca ini sekarang, itu artinya Anda harus mengikuti jawaban yang diterima sebagaimana diuraikan jika kode Anda dikelola oleh mesin yang terbaru.
Filip Dupanović

Pertanyaan OP adalah node.js khusus
Nicu Surdu

@NicolaeSurdu yakin. Ini juga dari Januari 2014, jadi mungkin sebagian besar berlebihan sekarang di 2017.
James Donnelly

41

Untuk alasan penggunaannya const, jawaban @ Tibos bagus.

Tapi Anda bilang:

Dari apa yang saya tahu, ini digunakan untuk membuat variabel tidak berubah

Itu salah . Memutasi suatu variabel berbeda dari menetapkan kembali:

var hello = 'world' // assigning
hello = 'bonjour!' // reassigning

Dengan const, Anda tidak dapat melakukan itu:

const hello = 'world'
hello = 'bonjour!' // error

Tetapi Anda dapat mengubah variabel Anda:

const marks = [92, 83]
marks.push(95)
console.log(marks) // [92, 83, 95] -> the variable has been mutated.

Jadi, setiap proses yang mengubah nilai variabel tanpa menggunakan =tanda berarti mengubah variabel.

Catatan: +=misalnya adalah ... menetapkan ulang!

var a = 5
a += 2 // is the same as a = a + 2

Jadi, intinya adalah: consttidak mencegah Anda dari mutasi variabel, itu mencegah Anda menetapkan ulang mereka.


4
pernyataan Anda "proses apa pun yang mengubah nilai variabel tanpa menggunakan =tanda dimatikan" secara teknis salah. Sebagai contoh, const marks=[92,83]; marks[2]=95; console.log(marks)akan menampilkan [92, 83, 95]. markstelah dimutasi, melalui tanda sama dengan.
chharvey

5
"Tapi kamu bilang: << Dari apa yang bisa kukatakan, ini digunakan untuk membuat variabel yang tidak bisa diubah >> Itu salah . Memutasi suatu variabel berbeda dengan menugaskan kembali" Tidak, tidak. Penugasan kembali sedang memutasikan variabel. Anda sedang berbicara tentang memutasi objek yang dirujuk oleh variabel. Sama sekali berbeda.
TJ Crowder

Sampai di sini karena saya mencoba memahami constdalam konteks array (mirip dengan contoh @chharvey yang digunakan). Dalam kasus const countArray = countup(n - 1); countArray.push(n);ini constadalah re-ditugaskan setiap kali. Jadi mengapa menggunakan constdan tidak var?
YCode

1
@Ykode no. ketika Anda menggunakan const countArray, itu tidak akan pernah dipindahkan. Anda masih dapat mendorong ke larik, yang mengubah anggota dan panjangnya, tetapi kami tidak menyebutnya menetapkan ulang. Anda menggunakan constalih-alih letatau varketika Anda ingin mencegah penugasan kembali. BTW jika Anda tidak ingin mengizinkan pemindahan, lethampir selalu lebih baik dari var.
chharvey

@chharvey Terima kasih! Tanggapan Anda membuat saya "lulus dengan nilai vs lulus dengan referensi", konsep baru, dan yang aneh - di mana modifikasi nilai ≠ penugasan kembali. Siapa pun yang membutuhkan penjelasan lebih lanjut harus memeriksa jawaban di sini: stackoverflow.com/q/46131828/5965865
YCode

38

Untuk mengintegrasikan jawaban sebelumnya, ada keuntungan yang jelas dalam mendeklarasikan variabel konstan, terlepas dari alasan kinerja: jika Anda secara tidak sengaja mencoba mengubah atau mendeklarasikannya kembali dalam kode, program masing-masing tidak akan mengubah nilai atau melemparkan kesalahan.

Sebagai contoh, bandingkan:

// Will output 'SECRET'

const x = 'SECRET'
if (x = 'ANOTHER_SECRET') {  // Warning! assigning a value variable in an if condition
    console.log (x)
}

dengan:

// Will output 'ANOTHER_SECRET'

var y = 'SECRET'
if (y = 'ANOTHER_SECRET') { 
    console.log (y)
}

atau

// Will throw TypeError: const 'x' has already been declared

const x = "SECRET"

/*  complex code */

var x = 0

dengan

// Will reassign y and cause trouble

var y = "SECRET"

/*  complex code */

var y = 0

Anda harus mengatakan bahwa perilaku "tidak berubah" ini hanya berlaku untuk String, Tipe Dasar. Menggunakan Objek, Array dll. Adalah mungkin untuk mengubah nilai-nilai tetapi tidak mungkin untuk menetapkan kembali "Objek" baru, misalnya const a = ["a", "b"]; a = []; akan melempar kesalahan jika tidak mungkin
Fer To

Anda harus memiliki contoh di mana Anda mencoba dan mengubah nilai konstanta juga.
Joshua Pinter

Menggunakan const sangat mirip dengan pengubah akses, kekekalan sejati bukanlah tujuannya.
StingyJack

32

constadalah tidak kekal.

Dari MDN :

Deklarasi const menciptakan referensi read-only ke suatu nilai. Itu tidak berarti nilai yang dipegangnya tidak berubah, hanya saja pengenal variabel tidak dapat dipindahkan.


24
Itu agak menyesatkan. Untuk angka, string, boolean, dll. (Primitif) consttidak berubah. Untuk objek dan array tidak dapat dipindahkan, tetapi konten dapat diubah (mis. Array.push).
Florian Wendelborn

2
Primitif JS selalu tidak berubah. Apakah Anda menggunakan constatau tidak tidak memengaruhi itu.
12Me21

1
@Dodekeract karena itu tidak berubah menurut definisi. Jika nilai dapat berubah itu tidak dapat diubah, meskipun berfungsi sebagai tidak berubah untuk primitif yang Anda daftarkan
Anthony

13

var : Deklarasikan variabel, inisialisasi nilai opsional.

let : Deklarasikan variabel lokal dengan cakupan blok.

const : Menyatakan konstanta read-only bernama.

Ex:

var a;
a = 1;
a = 2;//re-initialize possible
var a = 3;//re-declare
console.log(a);//3

let b;
b = 5;
b = 6;//re-initiliaze possible
// let b = 7; //re-declare not possible
console.log(b);

// const c;
// c = 9;   //initialization and declaration at same place
const c = 9;
// const c = 9;// re-declare and initialization is not possible
console.log(c);//9
// NOTE: Constants can be declared with uppercase or lowercase, but a common
// convention is to use all-uppercase letters.

10

Anda memiliki jawaban yang bagus, tetapi mari kita tetap sederhana.

const harus digunakan ketika Anda memiliki konstanta yang didefinisikan (dibaca sebagai: konstanta tidak akan berubah selama eksekusi program Anda).

Sebagai contoh:

const pi = 3.1415926535

Jika Anda berpikir bahwa itu adalah sesuatu yang dapat diubah pada eksekusi kemudian gunakan var .

Perbedaan praktis, berdasarkan contoh, adalah dengan const Anda akan selalu menganggap bahwa pi akan menjadi 3,14 [...], itu adalah fakta.

Jika Anda mendefinisikannya sebagai a var , mungkin 3,14 [...] atau tidak.

Untuk jawaban yang lebih teknis, @Tibos secara akademis benar.


7

Dalam pengalaman saya, saya menggunakan const ketika saya ingin mengatur sesuatu yang saya mungkin ingin mengubahnya nanti tanpa harus mencari kode yang mencari bit yang telah dikodekan misalnya jalur file atau nama server.

Kesalahan dalam pengujian Anda adalah hal lain, Anda mencoba membuat variabel lain yang disebut x, ini akan menjadi tes yang lebih akurat.

const x = 'const';
x = 'not-const';

9
Saya mengerti maksud Anda, tetapi - lucu bahwa "konstan" untuk Anda berarti "sesuatu yang mungkin ingin saya ubah". : P
Venryx

4

Preferensi pribadi sungguh. Anda bisa menggunakan const ketika, seperti yang Anda katakan, itu tidak akan ditugaskan kembali dan konstan. Misalnya jika Anda ingin menetapkan tanggal lahir Anda. Ulang tahun Anda tidak pernah berubah sehingga Anda dapat menggunakannya sebagai konstanta. Namun usia Anda memang berubah sehingga bisa jadi variabel.


17
Itu akan menjadi skrip yang berjalan sangat lama!
nullability

3
@nullability Tergantung pada berapa usia orang yang Anda lacak. Lebih dari beberapa lusin dan skrip tidak harus berjalan lama :).
Millie Smith

4

Ringkasan:

const menciptakan pengikat variabel konstanta makna pengikat yang tidak dapat diubah tidak dapat ditugaskan kembali.

const a = "value1";

Anda tidak dapat menetapkan ulang dengan

a = "value2";

Namun, jika const identifier menyimpan objek atau array, nilainya dapat diubah sejauh kami tidak menetapkan ulang.

const x = { a: 1 }

x.a = 2; //is possible and allowed

const numbers = [1, 2];
numbers.push(3); //is possible and allowed

Harap dicatat bahwa const adalah blok-tertutup seperti biarkan yang tidak sama dengan var (yang fungsi-lingkup)

Singkatnya, Ketika sesuatu tidak mungkin berubah melalui penugasan ulang gunakan const lain gunakan let atau var tergantung pada ruang lingkup yang ingin Anda miliki.

Jauh lebih mudah untuk alasan tentang kode ketika sudah jelas apa yang bisa diubah melalui penugasan kembali dan apa yang tidak bisa. Mengubah const ke let adalah mati sederhana. Dan menjadi const secara default membuat Anda berpikir dua kali sebelum melakukannya. Dan dalam banyak hal ini adalah hal yang baik.



2
Main point is that how to decide which one identifier should be used during development.
In java-script here are three identifiers.

1. var (Can re-declared & re-initialize)
2. const (Can't re-declared & re-initialize, can update array values by using push)
3. let (Can re-initialize but can't re-declare)

'var': Pada saat pengkodean ketika kita berbicara tentang standar kode maka kita biasanya menggunakan nama pengenal yang mana mudah dimengerti oleh pengguna / pengembang lain. Sebagai contoh jika kita bekerja pikirkan banyak fungsi di mana kita menggunakan beberapa input dan proses ini dan mengembalikan beberapa hasil, seperti:

**Example of variable use**

function firstFunction(input1,input2)
{
 var process = input1 + 2; 
 var result = process - input2;
 return result;
}


function otherFunction(input1,input2)
{
 var process = input1 + 8; 
 var result = process * input2;
 return result;
}

Dalam contoh di atas kedua fungsi menghasilkan hasil-2 yang berbeda tetapi menggunakan nama variabel yang sama. Di sini kita dapat melihat 'proses' & 'hasil' keduanya digunakan sebagai variabel dan seharusnya.

 **Example of constant with variable**

 const tax = 10; 
 const pi = 3.1415926535; 

function firstFunction(input1,input2)
{
 var process = input1 + 2; 
 var result = process - input2;
 result = (result * tax)/100; 
 return result;
}


function otherFunction(input1,input2)
{
 var process = input1 + 8; 
 var result = process * input2 * pi;
 return result;
}

Sebelum menggunakan 'let' dalam java-script kita harus menambahkan 'use strict' di bagian atas file js

 **Example of let with constant & variable**

 const tax = 10; 
 const pi = 3.1415926535; 
 let trackExecution = '';

function firstFunction(input1,input2)
{
 trackExecution += 'On firstFunction'; 
 var process = input1 + 2; 
 var result = process - input2;
 result = (result * tax)/100; 
 return result;
}


function otherFunction(input1,input2)
{
 trackExecution += 'On otherFunction'; # can add current time 
 var process = input1 + 8; 
 var result = process * input2 * pi;
 return result;
}

 firstFunction();
 otherFunction();
 console.log(trackExecution);

Dalam contoh di atas, Anda dapat melacak fungsi mana yang dijalankan ketika & fungsi mana yang tidak digunakan selama tindakan tertentu.


1

Pertama, tiga hal bermanfaat tentang const(selain peningkatan lingkup yang dibagikannya let):

  • Ini mendokumentasikan untuk orang yang membaca kode nanti bahwa nilainya tidak boleh berubah.
  • Ini mencegah Anda (atau siapa pun yang datang setelah Anda) dari mengubah nilai kecuali mereka kembali dan mengubah deklarasi dengan sengaja.
  • Ini mungkin menyimpan mesin JavaScript beberapa analisis dalam hal optimasi. Misalnya, Anda telah menyatakan bahwa nilainya tidak dapat berubah, sehingga mesin tidak perlu melakukan pekerjaan untuk mengetahui apakah nilainya berubah sehingga dapat memutuskan apakah akan mengoptimalkan berdasarkan nilai yang tidak berubah.

Pertanyaan Anda:

Kapan pantas digunakan constdi tempat var?

Anda dapat melakukannya kapan saja Anda mendeklarasikan variabel yang nilainya tidak pernah berubah. Apakah Anda menganggap yang sesuai sepenuhnya tergantung pada preferensi Anda / preferensi tim Anda.

Haruskah ini digunakan setiap kali variabel yang tidak akan ditugaskan kembali dinyatakan?

Terserah Anda / tim Anda.

Apakah benar-benar ada bedanya jika var is used in place ofconst` atau sebaliknya?

Iya:

  • vardan constmemiliki aturan ruang lingkup yang berbeda. (Anda mungkin ingin membandingkan dengan letdaripada var.) Khususnya: constdan letdiblok-blok dan, ketika digunakan pada lingkup global, jangan membuat properti pada objek global (meskipun mereka membuat global).varmemiliki cakupan global (bila digunakan pada lingkup global) atau cakupan fungsi (bahkan jika digunakan dalam blok), dan ketika digunakan di lingkup global, membuat properti pada objek global.
  • Lihat "tiga hal bermanfaat" saya di atas, semuanya berlaku untuk pertanyaan ini.

1

Semantik dari vardanlet

vardan letmerupakan pernyataan untuk mesin dan untuk programmer lain:

Saya bermaksud bahwa nilai tugas ini berubah selama pelaksanaan. Jangan mengandalkan nilai tugas ini pada akhirnya.

Implikasi penggunaan vardanlet

vardan letmemaksa pemrogram lain untuk membaca semua kode intervensi mulai dari deklarasi hingga penggunaan akhirnya, dan alasan tentang nilai penugasan pada saat itu dalam pelaksanaan program.

Mereka melemahkan alasan mesin untuk ESLint dan layanan bahasa lainnya untuk mendeteksi dengan benar nama variabel yang salah ketik dalam penugasan dan penggunaan kembali lingkup berikutnya dari nama variabel lingkup luar di mana lingkup dalam lupa untuk menyatakan.

Mereka juga menyebabkan runtimes untuk menjalankan banyak iterasi pada semua codepath untuk mendeteksi bahwa mereka sebenarnya, pada kenyataannya, adalah konstanta, sebelum mereka dapat mengoptimalkannya. Meskipun ini kurang dari masalah deteksi bug dan kelengkapan pengembang.

Kapan harus digunakan const

Jika nilai referensi tidak berubah selama eksekusi, sintaks yang benar untuk mengekspresikan maksud programmer adalah const. Untuk objek, mengubah nilai referensi berarti menunjuk ke objek lain, karena referensi tidak dapat diubah, tetapi objek tidak.

" const" objek

Untuk referensi objek, pointer tidak dapat diubah ke objek lain, tetapi objek yang dibuat dan ditetapkan ke constdeklarasi adalah bisa berubah. Anda dapat menambah atau menghapus item dari constarray yang direferensikan, dan mengubah kunci properti pada constobjek yang direferensikan.

Untuk mencapai objek yang tidak dapat diubah (yang sekali lagi, membuat kode Anda lebih mudah dipikirkan untuk manusia dan mesin), Anda dapat Object.freezeobjek di deklarasi / penugasan / pembuatan, seperti ini:

const Options = Object.freeze(['YES', 'NO'])

Object.freeze memang berdampak pada kinerja, tetapi kode Anda mungkin lambat karena alasan lain. Anda ingin profil itu.

Anda juga dapat merangkum objek yang dapat diubah dalam mesin keadaan dan mengembalikan salinan yang dalam sebagai nilai (ini adalah bagaimana Redux dan React state bekerja). Lihat Menghindari keadaan global yang bisa berubah di Browser JS untuk contoh bagaimana membangun ini dari prinsip pertama.

Kapan vardan letmerupakan pasangan yang baik

letdan varmewakili negara yang bisa berubah. Mereka seharusnya, menurut pendapat saya, hanya digunakan untuk memodelkan keadaan sebenarnya yang bisa berubah . Hal-hal seperti " apakah koneksinya hidup? ".

Ini adalah enkapsulasi terbaik dalam mesin negara yang dapat diuji yang mengekspos nilai konstan yang mewakili " keadaan koneksi saat ini ", yang merupakan konstanta pada setiap titik waktu, dan apa yang sebenarnya menarik dari kode Anda.

Pemrograman sudah cukup sulit dengan menyusun efek samping dan mengubah data. Mengubah setiap fungsi menjadi mesin keadaan yang tidak dapat diuji dengan membuat keadaan yang bisa berubah dengan variabel yang hanya menumpuk pada kompleksitas.

Untuk penjelasan yang lebih bernuansa, lihat Shun the Mutant - Case forconst .



0

Saya bukan ahli dalam bisnis kompilasi JS, tetapi masuk akal untuk mengatakan, bahwa v8 memanfaatkan dari flag const

Biasanya setelah mendeklarasikan dan mengubah banyak variabel, memori menjadi terfragmentasi, dan v8 berhenti untuk mengeksekusi, membuat jeda beberapa saat beberapa detik, untuk membuat gc, atau pengumpulan sampah.

jika suatu variabel dideklarasikan dengan const v8 dapat dengan percaya diri memasukkannya ke dalam wadah dengan ukuran tetap yang ketat di antara variabel-variabel const lainnya, karena ia tidak akan pernah berubah. Itu juga dapat menyimpan operasi yang tepat untuk tipe data itu karena tipe tidak akan berubah.


0

Ketika sampai pada keputusan antara let dan const , selalu lebih suka const sehingga penggunaannya jelas dalam kode. Dengan begitu, jika Anda mencoba untuk mendeklarasikan ulang variabel, Anda akan mendapatkan kesalahan. Jika tidak ada pilihan lain selain mendeklarasikan ulang, cukup beralih untuk biarkan . Perhatikan bahwa, seperti kata Anthony , nilainya tidak berubah (misalnya, objek const dapat memiliki properti yang dimutasi).

Ketika datang ke var , karena ES6 keluar, saya tidak pernah menggunakannya dalam kode produksi dan tidak bisa memikirkan use case untuk itu. Namun, berhati-hatilah bahwa variabel yang dideklarasikan dengan var tidak memiliki cakupan blok.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.