Baru-baru ini saya menemukan const
kata 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 var
kata kunci dapat digunakan untuk efek yang sama.
Jadi pertanyaan saya adalah:
- Kapan pantas digunakan
const
di tempatvar
? - Haruskah ini digunakan setiap kali variabel yang tidak akan ditugaskan kembali dinyatakan?
- Apakah itu benar-benar membuat perbedaan jika
var
digunakan sebagai pengganticonst
atau sebaliknya?
Jawaban:
Ada dua aspek dari pertanyaan Anda: apa saja aspek teknis dari penggunaan dan
const
bukanvar
apa 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,
var
harus selalu digunakan. Namun, tidak semua informasi yang tidak pernah berubah dalam masa pakai program perlu dinyatakanconst
. Jika dalam keadaan yang berbeda informasi harus berubah, gunakanvar
untuk menunjukkan itu, bahkan jika perubahan yang sebenarnya tidak muncul dalam kode Anda.sumber
const
objek tampaknya bisa berubah, jadi saya tidak yakin seberapa ketat kompiler JS sebenarnya. Mungkin mode "gunakan ketat" juga membuat perbedaan.const
hanya mencegah penugasan kembali "variabel" ke nilai lain.const a = {}; a = {};
akan melempar kesalahan dalam mode ketat.If there is room for error, var should always be used
. Hari ini hal ini tidak berlaku lagi, dengan alat seperti ESLint langsung menunjukkanconst
pelanggaran.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.ecmascript-6dukungan sekarang menjadi norma. Semua browser modern sekarang mendukung
const
sehingga 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 di
const
:Selanjutnya dikatakan:
Jika Anda menggunakannya,
const
Anda harus menambahkan solusi untuk mendukung browser yang sedikit lebih tua.sumber
Untuk alasan penggunaannya
const
, jawaban @ Tibos bagus.Tapi Anda bilang:
Itu salah . Memutasi suatu variabel berbeda dari menetapkan kembali:
Dengan const, Anda tidak dapat melakukan itu:
Tetapi Anda dapat mengubah variabel Anda:
Jadi, setiap proses yang mengubah nilai variabel tanpa menggunakan
=
tanda berarti mengubah variabel.Catatan:
+=
misalnya adalah ... menetapkan ulang!Jadi, intinya adalah:
const
tidak mencegah Anda dari mutasi variabel, itu mencegah Anda menetapkan ulang mereka.sumber
=
tanda dimatikan" secara teknis salah. Sebagai contoh,const marks=[92,83]; marks[2]=95; console.log(marks)
akan menampilkan[92, 83, 95]
.marks
telah dimutasi, melalui tanda sama dengan.const
dalam konteks array (mirip dengan contoh @chharvey yang digunakan). Dalam kasusconst countArray = countup(n - 1); countArray.push(n);
iniconst
adalah re-ditugaskan setiap kali. Jadi mengapa menggunakanconst
dan tidakvar
?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 menggunakanconst
alih-alihlet
atauvar
ketika Anda ingin mencegah penugasan kembali. BTW jika Anda tidak ingin mengizinkan pemindahan,let
hampir selalu lebih baik darivar
.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:
dengan:
atau
dengan
sumber
const
adalah tidak kekal.Dari MDN :
sumber
const
tidak berubah. Untuk objek dan array tidak dapat dipindahkan, tetapi konten dapat diubah (mis. Array.push).const
atau tidak tidak memengaruhi itu.var : Deklarasikan variabel, inisialisasi nilai opsional.
let : Deklarasikan variabel lokal dengan cakupan blok.
const : Menyatakan konstanta read-only bernama.
Ex:
sumber
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:
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.
sumber
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.
sumber
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.
sumber
Ringkasan:
const menciptakan pengikat variabel konstanta makna pengikat yang tidak dapat diubah tidak dapat ditugaskan kembali.
Anda tidak dapat menetapkan ulang dengan
Namun, jika const identifier menyimpan objek atau array, nilainya dapat diubah sejauh kami tidak menetapkan ulang.
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.
sumber
Ini memberikan: 1) referensi konstan, misalnya const x = [] - array dapat dimodifikasi, tetapi x tidak dapat menunjuk ke array lain; dan 2) memblokir pelingkupan. const dan mari bersama-sama akan menggantikan var di ecma6 / 2015 Lihat diskusi di https://strongloop.com/strongblog/es6-variable-declarations/
sumber
sumber
Pertama, tiga hal bermanfaat tentang
const
(selain peningkatan lingkup yang dibagikannyalet
):Pertanyaan Anda:
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.
Terserah Anda / tim Anda.
Iya:
var
danconst
memiliki aturan ruang lingkup yang berbeda. (Anda mungkin ingin membandingkan denganlet
daripadavar
.) Khususnya:const
danlet
diblok-blok dan, ketika digunakan pada lingkup global, jangan membuat properti pada objek global (meskipun mereka membuat global).var
memiliki 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.sumber
Semantik dari
var
danlet
var
danlet
merupakan pernyataan untuk mesin dan untuk programmer lain:Implikasi penggunaan
var
danlet
var
danlet
memaksa 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
" objekUntuk referensi objek, pointer tidak dapat diubah ke objek lain, tetapi objek yang dibuat dan ditetapkan ke
const
deklarasi adalah bisa berubah. Anda dapat menambah atau menghapus item dariconst
array yang direferensikan, dan mengubah kunci properti padaconst
objek 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.freeze
objek di deklarasi / penugasan / pembuatan, seperti ini: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
var
danlet
merupakan pasangan yang baiklet
danvar
mewakili 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 for
const
.sumber
'const' adalah indikasi kode Anda bahwa pengidentifikasi tidak akan dipindahkan. Ini adalah artikel yang bagus tentang kapan harus menggunakan 'const', 'let' atau 'var' https://medium.com/javascript-scene/javascript-es6-var-let-or-const-ba58b8dcde75#.ukgxpfhao
sumber
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.
sumber
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.
sumber