Karakter mana yang dapat digunakan untuk memberi nama variabel JavaScript?
Saya ingin membuat "pustaka ekstensi" kecil untuk pengguna non-JavaScript saya di sini di tempat kerja (yang semuanya tampaknya mudah tersinggung ketika berbicara tentang bahasa). Saya suka bagaimana jQuery dan Prototype menggunakan keduanya$
tanda dolar, dan karena saya menggunakan jQuery, saya mencari simbol karakter tunggal yang bagus untuk digunakan.
Saya menyadari bahwa saya hanya dapat menguji sejumlah karakter, tetapi saya berharap untuk mempersempit daftar karakter saya untuk memulai (dengan mempertimbangkan integrasi masa depan dengan perpustakaan populer lainnya, mungkin).
javascript
character
Richard Clayton
sumber
sumber
Jawaban:
Mengutip nama variabel JavaScript yang Valid , tulisan saya merangkum bagian spesifikasi yang relevan:
Saya juga membuat alat yang akan memberi tahu Anda jika string apa pun yang Anda masukkan adalah nama variabel JavaScript yang valid sesuai dengan ECMAScript 5.1 dan Unicode 6.1:
PS Untuk memberi Anda gambaran tentang betapa salahnya jawaban Anthony Mills adalah: jika Anda meringkas semua aturan ini dalam satu ekspresi reguler khusus ASCII untuk JavaScript, panjangnya akan menjadi 11.236 karakter . Ini dia:
sumber
¢
untuk melengkapi$
... oh well ...)-:
Dari spesifikasi ECMAScript di bagian 7.6 Nama dan Pengidentifikasi Identifier , pengidentifikasi yang valid didefinisikan sebagai:
yang menciptakan banyak peluang untuk variabel penamaan dan juga dalam bermain golf. Mari kita coba beberapa contoh.
Sebuah identifier yang valid bisa memulai dengan baik
UnicodeLetter
,$
,_
, atau\ UnicodeEscapeSequence
. Huruf unicode adalah karakter apa pun dari kategori ini ( lihat semua kategori ):Ini saja menyumbang beberapa kemungkinan gila - contoh kerja . Jika tidak bekerja di semua browser, maka sebut itu bug, karena itu seharusnya.
sumber
Pada dasarnya, dalam bentuk ekspresi reguler:
[a-zA-Z_$][0-9a-zA-Z_$]*
. Dengan kata lain, karakter pertama dapat berupa huruf atau _ atau $, dan karakter lain dapat berupa huruf atau _ atau $ atau angka.Catatan: Sementara jawaban lain menunjukkan bahwa Anda dapat menggunakan karakter Unicode di pengidentifikasi JavaScript, pertanyaan sebenarnya adalah "Karakter apa yang harus saya gunakan untuk nama perpustakaan ekstensi seperti jQuery?" Ini adalah jawaban untuk pertanyaan itu. Anda dapat menggunakan karakter Unicode dalam pengidentifikasi, tetapi jangan lakukan itu. Pengkodean kacau sepanjang waktu. Simpan pengidentifikasi publik Anda dalam rentang 32-126 ASCII di tempat yang aman.
sumber
Console.WriteLine("привет")
C # dan membuatnya benar-benar berfungsi !Sebelum JavaScript 1.5:
^[a-zA-Z_$][0-9a-zA-Z_$]*$
Dalam Bahasa Inggris: Ini harus dimulai dengan tanda dolar, garis bawah atau salah satu huruf dalam alfabet 26 karakter, huruf besar atau kecil. Karakter selanjutnya (jika ada) dapat berupa salah satu dari mereka atau angka desimal.
JavaScript 1.5 dan yang lebih baru * :
^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$
Ini lebih sulit untuk diekspresikan dalam bahasa Inggris, tetapi secara konseptual mirip dengan sintaks yang lebih lama dengan tambahan bahwa huruf dan angka dapat berasal dari bahasa apa pun. Setelah karakter pertama, ada juga karakter seperti garis bawah yang diperbolehkan (secara kolektif disebut "konektor") dan tambahan tanda menggabungkan karakter ("pengubah"). (Simbol mata uang lainnya tidak termasuk dalam rangkaian yang diperluas ini.)
JavaScript 1.5 dan yang lebih baru juga memungkinkan urutan pelepasan Unicode, asalkan hasilnya adalah karakter yang akan diizinkan dalam ekspresi reguler di atas.
Pengidentifikasi juga tidak boleh merupakan kata yang dilindungi undang-undang saat ini atau kata yang dipertimbangkan untuk digunakan di masa mendatang.
Tidak ada batasan praktis untuk panjang pengidentifikasi. (Peramban berbeda-beda, tetapi Anda akan memiliki 1000 karakter dengan aman dan mungkin beberapa urutan lebih besar dari itu.)
Tautan ke kategori karakter:
(digabungkan dalam regex di atas sebagai "L")
* nb Regex Perl ini hanya dimaksudkan untuk menggambarkan sintaks - ini tidak akan berfungsi dalam JavaScript, yang belum (belum) menyertakan dukungan untuk Properti Unicode. (Ada beberapa paket pihak ketiga yang mengklaim menambahkan dukungan tersebut.)
sumber
"test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === null
meskipun "test" adalah nama variabel JS yang valid\uD87E\uDC00
) Yang tidak cocok dengan salah satu dari Unicode yang diizinkan. kategori. Regex Anda, bagaimanapun, akan memungkinkan karakter seperti itu. Juga, U + 200C dan U + 200D tidak ada.Sebenarnya, ECMAScript mengatakan pada halaman 15: Bahwa pengidentifikasi dapat mulai dengan $, garis bawah atau UnicodeLetter, dan kemudian berlanjut (tepat di bawah itu) untuk menentukan bahwa UnicodeLetter dapat berupa karakter apa pun dari kategori unicode, Lo, Ll , Lu, Lt, Lm dan Nl. Dan ketika Anda melihat kategori-kategori itu, Anda akan melihat bahwa ini membuka lebih banyak kemungkinan daripada sekadar huruf latin. Cukup cari "unicode catagories" di google dan Anda dapat menemukannya.
sumber
Variabel Javascript
Anda dapat memulai variabel dengan huruf apa saja,
$
,, atau_
karakter. Selama tidak dimulai dengan angka, Anda dapat memasukkan angka juga.Mulailah:
[a-z], $, _
Berisi:
[a-z], [0-9], $, _
jQuery
Anda dapat menggunakan
_
untuk pustaka Anda sehingga itu akan berdiri berdampingan dengan jQuery. Namun, ada konfigurasi yang dapat Anda atur sehingga jQuery tidak akan digunakan$
. Alih-alih itu akan digunakanjQuery
. Untuk melakukan ini, cukup atur:Halaman ini menjelaskan cara melakukan ini.
sumber
Jawaban yang diterima akan mengesampingkan banyak pengidentifikasi yang valid , sejauh yang saya bisa lihat. Berikut adalah ekspresi reguler yang saya buat yang harus mengikuti spesifikasi (lihat bab 7.6 tentang pengidentifikasi). Dibuat menggunakan RegexBuddy dan Anda dapat menemukan ekspor penjelasan di http://samples.geekality.net/js-identifiers .
Selain itu, nama tidak boleh salah satu dari kata-kata yang dipesan berikut ini.
sumber
^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\u200C\u200D]*$
. Sekarang bahkan dengan koreksi saya sepertinya tidak bisa mendapatkan regex ini untuk benar-benar berfungsi."test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === null
meskipun "test" adalah nama variabel JS yang validtest
diterima juga.\uD87E\uDC00
) Yang tidak cocok dengan salah satu dari Unicode yang diizinkan. kategori. Regex Anda, bagaimanapun, akan memungkinkan karakter seperti itu.eval
,arguments
,NaN
,Infinity
danundefined
kasus tepi .Variabel Javascript dapat memiliki huruf, angka, tanda dolar ($) dan garis bawah (_). Mereka tidak dapat memulai dengan angka.
Biasanya perpustakaan menggunakan
$
dan_
sebagai pintasan untuk fungsi yang akan Anda gunakan di mana-mana. Meskipun namanya$
atau_
tidak bermakna, mereka berguna karena kekurangannya dan karena Anda akan menggunakan fungsi di mana pun Anda diharapkan untuk tahu apa artinya.Jika pustaka Anda tidak terdiri dari penggunaan satu fungsi yang digunakan di mana-mana, saya sarankan Anda menggunakan nama yang lebih bermakna karena itu akan membantu Anda dan orang lain memahami apa yang dilakukan kode Anda tanpa harus mengorbankan kebaikan kode sumber .
Misalnya, Anda bisa melihat pada perpustakaan DateJS yang mengagumkan dan pada gula sintaksis yang dibolehkan tanpa perlu simbol atau variabel nama pendek apa pun .
Pertama-tama Anda harus membuat kode Anda menjadi praktis, dan hanya setelah mencoba membuatnya cantik.
sumber
jika ekspresi reguler bukan suatu keharusan, bukankah lebih baik hanya meminta browser untuk memutuskan menggunakan
eval
?sumber
xss = alert("I'm in your vars executin mah scrip's");;;;;
misalnya bukan nama variabel javascript yang valid.xss;alert("try again");
name
dengan(typeof name === "string")? name.replace(/\(|\)/,"") : "_noXSS" )
? Jika ini adalah string, itu akan menggantikan tanda kurung (pasti tidak diizinkan dalam variabel), jadi saya pikir mengeksekusi sesuatu akan menjadi hampir mustahil.isValidVarName('aler(t')
menjadi benar. DanisValidVarName('_;;;')
tetap benar. Tapi Anda bisa mengecek di awal jika cocok dengan sesuatu seperti/[;,\(\)]/
tetapi kemudian Anda masih dapat mengeksekusi_=location="#!?"
sehingga Anda menambahkan=
ke daftar tetapi Anda masih dapat mengeksekusi'_\ndelete foo'
(yang lulus tes sebagai nama variabel yang valid) sehingga Anda harus mengecualikan\n
s dan\r
s dan mungkin beberapa baris baru unicode? Tapi `$` bukan pengidentifikasi yang valid sehingga Anda harus mengecualikan semua spasi putih ... Ini pertarungan yang merugi. Saya pikir itu sejauh yang saya bisa melawan diri sendiri denganif(/[;,\(\)=\s]/.exec(name))return!1
Berikut adalah satu saran cepat untuk membuat nama variabel. Jika Anda ingin variabel tidak konflik saat digunakan di FireFox, jangan gunakan nama variabel " _content " karena nama variabel ini sudah digunakan oleh browser. Saya menemukan ini dengan cara yang sulit dan harus mengubah semua tempat saya menggunakan variabel "_content" dalam aplikasi JavaScript besar.
sumber
Saya telah mengambil ide Anas Nakawa dan memperbaikinya. Pertama-tama, tidak ada alasan untuk benar-benar menjalankan fungsi yang dideklarasikan. Kami ingin tahu apakah itu diurai dengan benar, bukan apakah kodenya berfungsi. Kedua, objek literal adalah konteks yang lebih baik untuk tujuan kita daripada
var XXX
karena lebih sulit untuk keluar.sumber
isValidVarName('}; }); alert("I\'m in your vars executin\' mah scripts"); true; // yeah, super valid');
}
mencegah hal itu.isValidVarName("delete") === true
Menulis ruang kerja kesalahan yang iterates atas semua codepoint dan memancarkan karakter jika
eval('var ' + String.fromCodePoint(#) + ' = 1')
berfungsi.Itu terus berjalan, dan terus, dan terus ....
sumber