Apakah ada cara untuk menggunakan konstanta dalam JavaScript ?
Jika tidak, apa praktik umum untuk menentukan variabel yang digunakan sebagai konstanta?
javascript
constants
fuentesjr
sumber
sumber
Chrome
memungkinkan Anda menggunakan kata kunciconst
untuk menggunakan konstanta. misconst ASDF = "asdf"
. Namun, karenaconst
tidak multi-browser yang kompatibel, saya biasanya tetap denganvar
deklarasi.try{const thing=1091;}catch(e){var thing=1091;}
bekerja.const
atau tidakvar
sama sekali?const
memiliki cakupan yang sama denganvar
, dan itu adalah level-fungsi, bukan level-blok. Jika Anda mengikuti standar ECMAScript mendatang,const
memiliki cakupan yang sama denganlet
, yang berarti tidak akan berfungsi.Jawaban:
Sejak ES2015 , JavaScript memiliki gagasan tentang
const
:Ini akan bekerja di hampir semua browser kecuali IE 8, 9 dan 10 . Beberapa mungkin juga membutuhkan mode ketat diaktifkan.
Anda dapat menggunakan
var
dengan konvensi seperti ALL_CAPS untuk menunjukkan bahwa nilai-nilai tertentu tidak boleh dimodifikasi jika Anda perlu mendukung browser lama atau bekerja dengan kode lawas:sumber
const
kata kunci. Saat ini didukung oleh semua browser modern kecuali untuk IE.Object.defineProperty
untuk membuat properti hanya-baca yang juga tidak dapat dihapus. Ini berfungsi di versi saat ini dari semua browser utama (tetapi salah di IE8 ). Lihat jawabannya oleh @NotANameconst
kunci sekarang secara resmi bagian dari bahasa dan didukung oleh setiap browser. Menurut statcounter.com, hanya beberapa persen pengguna internet yang masih menggunakan versi browser lama yang tidak mendukungconst
.Apakah Anda mencoba melindungi variabel terhadap modifikasi? Jika demikian, maka Anda dapat menggunakan pola modul:
Dengan menggunakan pendekatan ini, nilai-nilai tidak dapat dimodifikasi. Tapi, Anda harus menggunakan metode get () di CONFIG :(.
Jika Anda tidak perlu secara ketat melindungi nilai variabel, maka lakukan saja seperti yang disarankan dan gunakan konvensi ALL CAPS.
sumber
CONFIG.get = someNewFunctionThatBreaksTheCode
... Semua dalam semua, Anda benar-benar tidak dapat menegakkan konstanta di JS (tanpa kata kunci const). Satu-satunya hal yang dapat Anda lakukan adalah membatasi visibilitas.private
adalah kata cadangan masa depan dalam JavaScript, saya tidak akan menggunakannya jika saya adalah Anda.Kata
const
kunci dalam draft 6 ECMAScript tetapi sejauh ini hanya menikmati segelintir dukungan browser: http://kangax.github.io/compat-table/es6/ . Sintaksnya adalah:sumber
const
, itu tidak menimbulkan kesalahan. Tugas baru saja gagal dan konstanta masih memiliki nilai aslinya. Ini adalah cacat desain IMHO utama tetapi selama ada konvensi penamaan yang jelas dan konsisten (seperti ALL_CAPS populer) Saya tidak berpikir itu akan menyebabkan terlalu banyak kesedihan.'use strict'
.ALL CAPS
?Lihat Object.freeze . Anda dapat menggunakan
const
jika Anda ingin membuatconstants
referensi hanya-baca juga.sumber
i
const
deklarasi ES6 , misalnya properti tidak dapat dideklarasikan ulang atau ditugaskan kembali, tetapi jika mereka bertipe dataobject
, mereka dapat dimutasi.const constants
alih-alihvar constants
untuk mencegah penugasan kembali variabel.IE tidak mendukung konstanta, semacam, misalnya:
sumber
const
). Bisakah Anda menjelaskan apa yang salah dengannya?ECMAScript 5 memperkenalkan
Object.defineProperty
:Ini didukung di setiap browser modern (serta IE ≥ 9).
Lihat juga: Object.defineProperty di ES5?
sumber
writable: false
- benar akan menimbulkan kesalahan jika kode yang melakukan penugasan tersebut ditafsirkan dalam mode ketat ECMAScript 5. Hanya alasan lain untuk menuliskan'use strict'
kode Anda.writable: false
karena itu defaultnya .Tidak, tidak secara umum. Firefox mengimplementasikan
const
tetapi saya tahu IE tidak.@ John menunjuk ke praktik penamaan yang umum untuk const yang telah digunakan selama bertahun-tahun dalam bahasa lain, saya tidak melihat alasan mengapa Anda tidak bisa menggunakannya. Tentu saja itu tidak berarti seseorang tidak akan menulis lebih dari nilai variabel. :)
sumber
Dalam JavaScript, preferensi saya adalah menggunakan fungsi untuk mengembalikan nilai konstan.
sumber
Mozillas MDN Web Documents berisi contoh dan penjelasan yang bagus tentang
const
. Kutipan:Tapi itu menyedihkan bahwa IE9 / 10 masih tidak mendukung
const
. Dan alasan itu tidak masuk akal :Mereka tidak mengimplementasikannya karena browser lain tidak menerapkannya dengan benar ?! Terlalu takut membuatnya lebih baik? Definisi standar atau tidak, konstanta adalah konstanta: diset sekali, tidak pernah berubah.
Dan untuk semua ide: Setiap fungsi dapat ditimpa (XSS dll.). Jadi tidak ada perbedaan dalam
var
ataufunction(){return}
.const
adalah satu-satunya konstanta yang nyata.Pembaruan: IE11 mendukung
const
:sumber
Jika Anda tidak keberatan menggunakan fungsi:
Pendekatan ini memberi Anda fungsi alih-alih variabel biasa, tetapi menjamin * bahwa tidak ada yang dapat mengubah nilai begitu ditetapkan.
Saya pribadi menemukan ini agak menyenangkan, terutama setelah terbiasa dengan pola ini dari KO yang dapat diamati.
* Kecuali seseorang mendefinisikan ulang fungsi
constant
sebelum Anda menyebutnyasumber
a = constant(10); a(10); // 10
diikuti oleha = constant(25); a(); //25
, tidak ada kesalahan atau peringatan yang diberikan, tidak ada indikasi bahwa konstanta Anda telah rusak.a
maka itu berubah menjadi nilai barudengan api objek "baru" Anda dapat melakukan sesuatu seperti ini:
lihat ini di Mozilla MDN untuk lebih spesifik. Ini bukan variabel tingkat pertama, karena dilampirkan ke objek, tetapi jika Anda memiliki cakupan, apa pun, Anda dapat melampirkannya ke sana.
this
harus bekerja juga. Jadi misalnya melakukan ini dalam lingkup global akan mendeklarasikan nilai konstan semu di jendela (yang merupakan ide yang sangat buruk, Anda tidak boleh mendeklarasikan global vars dengan sembrono)catatan: tugas akan memberi Anda kembali nilai yang ditugaskan di konsol, tetapi nilai variabel tidak akan berubah
sumber
Konstanta kelompok ke dalam struktur jika memungkinkan:
Contoh, dalam proyek game saya saat ini, saya telah menggunakan di bawah ini:
Tugas:
Perbandingan:
Baru-baru ini saya menggunakan, untuk perbandingan:
IE11 dengan standar ES6 baru yang memiliki deklarasi 'const'.
Di atas berfungsi di browser sebelumnya seperti IE8, IE9 & IE10.
sumber
Anda dapat dengan mudah melengkapi skrip Anda dengan mekanisme untuk konstanta yang dapat diatur tetapi tidak diubah. Upaya untuk mengubahnya akan menghasilkan kesalahan.
sumber
Lupakan IE dan gunakan
const
kata kunci.sumber
Namun tidak ada cara yang pasti untuk melakukan cross browser, Anda dapat mencapainya dengan mengendalikan ruang lingkup variabel seperti yang ditunjukkan pada jawaban lain.
Tetapi saya akan menyarankan untuk menggunakan ruang nama untuk membedakan dari variabel lain. ini akan mengurangi kemungkinan tabrakan ke minimum dari variabel lain.
Seperti namespace yang tepat
jadi saat menggunakannya akan
iw_constant.name
atauiw_constant.age
Anda juga dapat memblokir menambahkan kunci baru atau mengubah kunci apa pun di dalam iw_constant menggunakan metode Object.freeze. Namun itu tidak didukung pada browser lawas.
ex:
Untuk browser yang lebih lama, Anda dapat menggunakan metode polyfill untuk membekukan.
Jika Anda setuju dengan fungsi panggilan berikut ini adalah cara terbaik lintas browser untuk menetapkan konstanta. Mencakup objek Anda dalam fungsi yang dijalankan sendiri dan mengembalikan fungsi get untuk konstanta Anda, ex:
// untuk mendapatkan penggunaan nilai
iw_constant('name')
atauiw_constant('age')
** Dalam kedua contoh, Anda harus sangat berhati-hati dalam penamaan nama sehingga objek atau fungsi Anda tidak boleh diganti melalui perpustakaan lain. (Jika objek atau fungsi itu sendiri akan diganti seluruh konstanta Anda akan hilang)
sumber
Untuk sementara, saya menetapkan "konstanta" (yang masih belum benar-benar konstan) dalam objek literal diteruskan ke
with()
pernyataan. Saya pikir itu sangat pintar. Ini sebuah contoh:Di masa lalu, saya juga telah membuat
CONST
namespace di mana saya akan meletakkan semua konstanta saya. Sekali lagi, dengan biaya overhead. Sheesh.Sekarang, saya hanya melakukan
var MY_CONST = 'whatever';
untuk Kiss .sumber
with
.Pendapat saya (hanya bekerja dengan objek).
Mencoba! Tapi mengerti - ini adalah objek, tetapi bukan variabel sederhana.
Coba juga:
sumber
Saya juga punya masalah dengan ini. Dan setelah cukup lama mencari jawaban dan melihat semua tanggapan oleh semua orang, saya pikir saya telah menemukan solusi yang layak untuk ini.
Tampaknya sebagian besar jawaban yang saya temui menggunakan fungsi untuk memegang konstanta. Seperti banyak pengguna posting forum BANYAK tentang, fungsi dapat dengan mudah ditulis oleh pengguna di sisi klien. Saya tertarik dengan jawaban Keith Evetts bahwa objek konstanta tidak dapat diakses oleh luar, tetapi hanya dari fungsi di dalam.
Jadi saya datang dengan solusi ini:
Letakkan semuanya di dalam fungsi anonim sehingga variabel, objek, dll. Tidak dapat diubah oleh sisi klien. Sembunyikan juga fungsi 'nyata' dengan meminta fungsi lain memanggil fungsi 'nyata' dari dalam. Saya juga berpikir untuk menggunakan fungsi untuk memeriksa apakah suatu fungsi telah diubah oleh pengguna di sisi klien. Jika fungsi telah diubah, ubah kembali menggunakan variabel yang 'dilindungi' di bagian dalam dan tidak dapat diubah.
Tampaknya juga keamanan benar-benar masalah dan tidak ada cara untuk 'menyembunyikan' pemrograman Anda dari sisi klien. Ide bagus bagi saya adalah mengompres kode Anda sehingga sangat sulit bagi siapa pun, termasuk Anda, programmer, untuk membaca dan memahaminya. Ada situs yang bisa Anda kunjungi: http://javascriptcompressor.com/ . (Ini bukan situs saya, jangan khawatir saya tidak beriklan.) Ini adalah situs yang akan memungkinkan Anda mengompres dan mengaburkan kode Javascript secara gratis.
sumber
Jelas ini menunjukkan perlunya kata kunci const cross-browser standar.
Tetapi untuk sekarang:
atau
Keduanya tampak memadai dan yang lainnya seperti menembak lalat dengan bazoka.
sumber
Saya menggunakan
const
bukannyavar
dalam skrip Greasemonkey saya, tetapi itu karena mereka akan berjalan hanya pada Firefox ...Konvensi nama memang bisa menjadi cara untuk pergi juga (saya melakukan keduanya!).
sumber
Dalam JavaScript, praktik saya adalah menghindari konstanta sebanyak yang saya bisa dan menggunakan string. Masalah dengan konstanta muncul ketika Anda ingin mengekspos konstanta Anda ke dunia luar:
Misalnya seseorang dapat mengimplementasikan API Tanggal berikut:
Tetapi jauh lebih pendek dan lebih alami untuk hanya menulis:
Dengan cara ini "hari" dan "jam" benar-benar bertindak seperti konstanta, karena Anda tidak dapat mengubah dari luar berapa banyak yang diwakili oleh "jam". Tapi itu mudah ditimpa
MyModule.Date.HOUR
.Pendekatan semacam ini juga akan membantu dalam debugging. Jika Firebug memberi tahu Anda
action === 18
, cukup sulit untuk mencari tahu apa artinya itu, tetapi ketika Anda melihatnyaaction === "save"
maka segera jelas.sumber
"Hours"
alih-alih"hours"
- tetapi sebuah IDE mungkin memberi tahu Anda sejak awal bahwaDate.Hours
itu tidak didefinisikan.Oke, ini jelek, tapi itu memberi saya konstanta di Firefox dan Chromium, konstanta tidak konstan (WTF?) Di Safari dan Opera, dan variabel di IE.
Tentu saja eval () adalah jahat, tetapi tanpa itu, IE melempar kesalahan, mencegah skrip berjalan.
Safari dan Opera mendukung kata kunci const, tetapi Anda dapat mengubah nilai const .
Dalam contoh ini, kode sisi server menulis JavaScript ke halaman, menggantikan {0} dengan sebuah nilai.
Apa gunanya ini? Tidak banyak, karena ini bukan cross-browser. Paling-paling, mungkin sedikit ketenangan pikiran yang setidaknya beberapa browser tidak akan membiarkan bookmarklet atau skrip pihak ketiga memodifikasi nilainya.
Diuji dengan Firefox 2, 3, 3.6, 4, Iron 8, Chrome 10, 12, Opera 11, Safari 5, IE 6, 9.
sumber
Jika layak disebutkan, Anda bisa mendefinisikan konstanta dalam penggunaan sudut
$provide.constant()
sumber
Sebuah versi perbaikan dari jawaban Burke yang memungkinkan Anda melakukan
CONFIG.MY_CONST
bukanCONFIG.get('MY_CONST')
.Ini membutuhkan IE9 + atau browser web nyata.
* Properti hanya baca, hanya jika nilai awal tidak berubah.
sumber
JavaScript ES6 (kembali) memperkenalkan
const
kata kunci yang didukung di semua browser utama .Selain itu,
const
berperilaku mirip denganlet
.Itu berperilaku seperti yang diharapkan untuk tipe data primitif (Boolean, Null, Undefined, Number, String, Symbol):
Perhatian: Waspadai perangkap tentang objek:
Jika Anda benar-benar membutuhkan objek yang tidak berubah dan benar-benar konstan: Gunakan saja
const ALL_CAPS
untuk memperjelas niat Anda. Ini adalah konvensi yang baik untuk diikuti untuk semuaconst
deklarasi, jadi andalkan saja.sumber
Alternatif lain adalah sesuatu seperti:
Maka cukup:
var foo = constantMap.MY_CONSTANT
Jika Anda melakukannya
constantMap.MY_CONSTANT = "bar"
tidak akan berpengaruh karena kami mencoba menggunakan operator penugasan dengan pengambil, maka ituconstantMap.MY_CONSTANT === "myconstant"
akan tetap benar.sumber
di Javascript sudah ada konstanta . Anda mendefinisikan konstanta seperti ini:
Ini tidak dapat diubah melalui penugasan kembali.
sumber
Kata kunci 'const' telah diusulkan sebelumnya dan sekarang telah secara resmi dimasukkan dalam ES6. Dengan menggunakan kata kunci const, Anda dapat meneruskan nilai / string yang akan bertindak sebagai string yang tidak dapat diubah.
sumber
Memperkenalkan konstanta ke dalam JavaScript paling-paling merupakan peretasan.
Cara yang bagus untuk membuat nilai yang persisten dan dapat diakses secara global dalam JavaScript adalah mendeklarasikan objek literal dengan beberapa properti "baca-saja" seperti ini:
Anda akan memiliki semua konstanta Anda dikelompokkan dalam satu objek aksesori "saya" di mana Anda dapat mencari nilai yang tersimpan atau apa pun yang mungkin telah Anda putuskan untuk dimasukkan ke sana. Sekarang mari kita coba apakah itu berfungsi:
Seperti yang bisa kita lihat, properti "my.constant1" telah mempertahankan nilai aslinya. Anda telah membuat sendiri beberapa konstanta sementara 'hijau' yang bagus ...
Tetapi tentu saja ini hanya akan melindungi Anda dari memodifikasi, mengubah, membatalkan, atau mengosongkan nilai konstan properti Anda secara tidak sengaja dengan akses langsung seperti dalam contoh yang diberikan.
Kalau tidak, saya masih berpikir bahwa konstanta adalah untuk boneka. Dan saya masih berpikir bahwa menukar kebebasan besar Anda dengan sudut keamanan yang menipu adalah perdagangan terburuk yang mungkin terjadi.
sumber
Rhino.js
mengimplementasikanconst
selain apa yang disebutkan di atas.sumber