Saya telah menulis banyak kode ES6 untuk io.js baru-baru ini. Tidak ada banyak kode di alam liar untuk dipelajari, jadi saya merasa seperti saya mendefinisikan konvensi saya sendiri ketika saya pergi.
Pertanyaan saya adalah tentang kapan harus menggunakan const
vs let
.
Saya telah menerapkan aturan ini: Jika memungkinkan, gunakan const
. Hanya gunakan let
jika Anda tahu nilainya perlu diubah. (Anda selalu dapat kembali dan mengubah const
ke let
jika nanti ternyata Anda perlu mengubah nilainya.)
Alasan utama aturan ini adalah mudah untuk diterapkan secara konsisten. Tidak ada area abu-abu.
Masalahnya adalah, ketika saya menerapkan aturan ini, dalam praktiknya 95% dari deklarasi saya adalah const
. Dan ini terlihat aneh bagiku. Saya hanya menggunakan let
untuk hal-hal seperti i
dalam satu for
lingkaran, atau kadang-kadang untuk hal-hal seperti akumulasi total Fibonacci (yang tidak banyak muncul dalam kehidupan nyata). Saya terkejut dengan ini - ternyata 95% dari 'variabel' dalam kode ES5 saya saat ini adalah untuk nilai-nilai yang tidak bervariasi. Tetapi melihat const
seluruh kode saya terasa salah.
Jadi pertanyaan saya adalah: apakah boleh menggunakan const
sebanyak ini? Haruskah saya benar-benar melakukan hal-hal seperti const foo = function () {...};
?
Atau haruskah saya memesan const
untuk situasi-situasi di mana Anda membuat kode literal di bagian atas modul - seperti yang Anda lakukan dengan huruf besar, seperti const MARGIN_WIDTH = 410;
?
sumber
const
sebanyak ini.function foo() {...}
lebih baik dari<anything> foo = function() {...}
function foo() {...}
dapat menyebabkan kebingungan kecil saat debugging, karena mengangkat. Juga, keberadaannya berarti kita memiliki dua konstruksi yang melakukan hal yang sama tetapi salah satunya hanya bekerja dalam konteks yang sangat spesifik. (Anda bisa menggunakan ekspresi fungsi di mana pun ekspresi bisa ada, tetapi Anda hanya bisa menggunakan deklarasi fungsi di level pernyataan.) Jika Anda menyukai singkatnya, masalahnya mungkin saja sintaks ekspresi fungsi menggunakan seluruh katafunction
.Jawaban:
Balasan saya di sini tidak spesifik javascript.
Sebagai aturan praktis dalam bahasa apa pun yang memungkinkan saya melakukannya dengan cara semi-mudah saya akan mengatakan selalu menggunakan const / final / readonly / apa pun namanya dalam bahasa Anda bila memungkinkan. Alasannya sederhana, jauh lebih mudah untuk alasan tentang kode ketika sudah jelas apa yang bisa berubah dan apa yang tidak bisa berubah. Dan selain itu, dalam banyak bahasa Anda bisa mendapatkan dukungan alat yang memberi tahu Anda bahwa Anda melakukan sesuatu yang salah ketika Anda secara tidak sengaja menetapkan ke variabel yang telah Anda nyatakan sebagai const.
Kembali dan 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.
Berapa banyak bug yang Anda lihat yang melibatkan variabel berubah secara tak terduga? Saya banyak menebak. Saya tahu bahwa sebagian besar bug yang saya lihat melibatkan perubahan status yang tidak terduga. Anda tidak akan menghilangkan semua bug ini dengan bebas menggunakan const, tetapi Anda akan menyingkirkan banyak dari mereka!
Juga, banyak bahasa fungsional memiliki variabel tidak berubah di mana semua variabel adalah konst secara default. Lihatlah Erlang misalnya, atau F #. Pengodean tanpa penugasan bekerja dengan sempurna dalam bahasa-bahasa ini dan merupakan salah satu dari banyak alasan mengapa orang menyukai pemrograman fungsional. Ada banyak yang harus dipelajari dari bahasa-bahasa ini tentang mengelola negara agar menjadi programmer yang lebih baik.
Dan itu semua dimulai dengan menjadi sangat liberal dengan const! ;) Ini hanya dua karakter untuk ditulis dibandingkan dengan membiarkan, jadi lanjutkan dan
const
semua hal!sumber
const
adalah dua karakter lebih darilet
...val
di Scala (yang mendeklarasikan variabel sebagai tidak dapat diubah) dan hanya menggunakanvar
(setara yang bisa berubah) ketika kita tidak bisa menggunakanval
. Dengan kata lain, kami mendeklarasikan variabel sebagai tidak dapat diubah secara default dan hanya memperkenalkan kemampuan berubah ketika kami benar-benar membutuhkannya (yang mungkin hanya karena pendekatan yang dapat diubah lebih bersih).Hati-hati, karena
const
kunci objek bisa berubah.Dari sini: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
pertimbangkan contoh ini:
Hal yang sama untuk array:
Saya belum memutuskan sepenuhnya sendiri, tapi saya mempertimbangkan
const
untuk menggunakan untuk semua non-array / non-objek dan digunakanlet
untuk objek / array.sumber
const
.colors = numbers
tidak akan bekerja, seperti yang diharapkan. Jika Anda ingin melindungi properti objek Anda, Anda dapat menggunakanObject.freeze()
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…const moment = require('moment')
,, kecuali jika Anda adalah tipe orang yang khawatir seseorang akan mencoba melakukannyamoment = dead.fish(() => pizza)
nanti.moment = Date.now()
. Tetapi bagaimanapun juga, jika kode tersebut dianggap invarian, saya tidak melihat ada masalah dengan memberlakukannya jika memungkinkan.Jangan khawatir tentang itu.
const
adalah tambahan yang luar biasa untuk JavaScript, dan saya akan merekomendasikan Anda menggunakannya semua tempat yang masuk akal. Itu membuat kode lebih kuat.Ketika datang ke objek,
const
akan melindungi variabel Anda dari penugasan kembali, tetapi jika Anda membutuhkan objek abadi, Anda akan memerlukanObject.freeze
metode, lihat di bawah.const
hanya akan melindungi dari penugasan kembali, danfreeze
metode ini akan melindungi semua properti langsung. Jika Anda membutuhkan semua properti bersarang agar tidak berubah juga, maka Anda harus secara rekursiffreeze
.sumber
Object.freeze
dangkal.Dalam ES6
const
saya bukan tentang post immutability , saya jelaskan apaconst
artinya persis menurut spec.Berdasarkan fakta-fakta obyektif itu, inilah preferensi pribadi saya:
Meskipun subjektif, itu fakta bahwa ini paling dekat dengan maksud spec.
Orang-orang yang menggunakan
let
secara default biasanya memperlakukanconst
variabel sebagai konstanta (yang tidak harus, dengan desain!). Untuk masing-masing mereka sendiri, tetapi saya lebih suka menggunakan hal-hal untuk tujuan yang mereka maksudkan, dan bukan untuk beberapa makna yang dibuat-buat orang ditugaskan kepadanya berdasarkan kesalahpahaman.Menggunakan
const
hanya untuk konstanta seperti menggunakan elemen HTML<aside>
hanya untuk konten bilah samping.sumber
const
jika tidak konstan?const
. Apakah Anda membaca di atas?const
itu disebutconst
. Itu nama bodoh (dalam javascript) yang membingungkan banyak (semua?) Pengembang pada awalnya. IMO lebih baik jikaconst
telah dipanggillet
(terutama karenalet
lebih pendek tetapiconst
jauh lebih umum) danlet
disebut sesuatu yang lain.Pendekatan pribadi saya, berpikir untuk membantu pembacaan dan pemahaman kode:
let
hanya untuk variabel berumur pendek, didefinisikan pada satu baris dan tidak berubah setelahnya. Secara umum variabel-variabel yang ada hanya mengurangi jumlah pengetikan. Sebagai contoh:const
untuk semua nama yang diketahui konstan di seluruh modul. Tidak termasuk nilai konstan lokal. Dalamvalue
contoh di atas, misalnya, konstan dalam cakupannya dan dapat dideklarasikan denganconst
, tetapi karena ada banyak iterasi dan untuk masing-masing ada nilai dengan nama yang sama , "nilai", yang dapat menipu pembaca agar berpikirvalue
selalu sama. Modul dan fungsi adalah contoh terbaik dariconst
variabel:var
untuk segala sesuatu yang mungkin atau tidak variabel. Nama-nama yang dapat membingungkan orang-orang yang membaca kode, meskipun mereka konstan secara lokal, dan tidak cocok untuklet
(yaitu, mereka tidak dilengkapi dalam deklarasi langsung sederhana) berlaku untuk dideklarasikan denganvar
. Sebagai contoh:Komentar lebih lanjut dan kemungkinan pembaruan di masa depan di sini .
sumber
JavaScript agak spesial karena variabel dapat berupa fungsi dan semacamnya, tetapi pertimbangkan dalam C #, Java atau bahasa gaya C serupa lainnya:
The
const
aneh, dan itu karena deklarasi metode dalam bahasa ini tidak bisa berubah, begitu mereka dikompilasi ke dalam sesuatu yang lain, yaitu apa yang mereka lakukan, tidak peduli apa (mengabaikan beberapa hacks mengerikan yang mungkin ada).Mengapa JavaScript harus berbeda? Jadi itu tidak dikompilasi, tetapi itu tidak berarti kita harus membuang keamanan yang dapat diberikan oleh kompiler. Menggunakan
const
kata kunci memberi kita lebih banyak keamanan, yang tentunya akan mengarah pada aplikasi yang lebih kuat.sumber