Karakter apa yang valid untuk nama variabel JavaScript?

557

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).

Richard Clayton
sumber
44
TIDAK. Huruf Unicode dapat diterima. Coba π, misalnya.
nalply
14
Meskipun huruf unicode dapat diterima dalam nama variabel, penggunaan unicode dalam kode bisa menimbulkan masalah . Saya sarankan untuk tidak menggunakannya dalam nama variabel jika Anda bisa bertahan tanpa mereka.
Gary S. Weaver
Apakah F # nama variabel yang valid? Saya sedang membangun perpustakaan javascript fungsional kecil dan saya ingin menggunakan F # untuk nama modulnya. Panggilan fungsi khas akan terlihat seperti ini: F # .partial (fn, ... presetArgs);
Jules Manson
@JulesManson Tidak, karena simbol pound dicadangkan untuk penggunaan lain.
Aidan Lovelace
@JulesManson By the way, nama F # sudah diambil oleh Microsoft dari .NET
Luke the Geek

Jawaban:

986

Mengutip nama variabel JavaScript yang Valid , tulisan saya merangkum bagian spesifikasi yang relevan:

Pengidentifikasi harus dimulai dengan $,, _atau karakter apa pun dalam kategori Unicode "Huruf besar (Lu)" , "Huruf kecil (Ll)" , "Hurlecase (Lt)" , "Huruf pengubah (Lm)" , "Huruf lain ( Lo) ” , atau “ Nomor surat (Nl) ” .

Sisa string dapat berisi karakter yang sama, ditambah U + 200C nol lebar non-joiner karakter, U + 200D nol joiner lebar karakter, dan karakter dalam kategori Unicode “Non-jarak mark (Mn)” , “Spasi menggabungkan tandai (Mc) ” , “ Angka angka desimal (Nd) ” , atau “ Tanda baca konektor (Pc) ” .

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:

Validator nama variabel JavaScript


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:

// ES5.1 / Unicode 6.1
/^(?!(?:do|if|in|for|let|new|try|var|case|else|enum|eval|false|null|this|true|void|with|break|catch|class|const|super|throw|while|yield|delete|export|import|public|return|static|switch|typeof|default|extends|finally|package|private|continue|debugger|function|arguments|interface|protected|implements|instanceof)$)[$A-Z\_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc][$A-Z\_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc0-9\u0300-\u036f\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e4-\u08fe\u0900-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d02\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19b0-\u19c0\u19c8\u19c9\u19d0-\u19d9\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2-\u1cf4\u1dc0-\u1de6\u1dfc-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f1\ua900-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f]*$/
Mathias Bynens
sumber
31
Saya akan memberi Anda kredit untuk jumlah waktu yang Anda perlukan untuk menghasilkan ini.
Richard Clayton
18
@ marsbear Saya kebetulan telah menulis artikel tentang itu juga: mathiasbynens.be/notes/javascript-properties Dan alat, juga: mothereff.in/js-properties#12e34 Ini jawaban Stack Overflow yang relevan dari tambang.
Mathias Bynens
2
Sialan jadi saya tidak bisa menjadi pintar dan menggunakan ¢untuk melengkapi $... oh well ...)-:
hippietrail
3
Itu benar (dan jawaban yang luar biasa). Namun ini tidak menjadikannya Benar: mengaburkan kode dengan menggunakan huruf yang tampak mirip tetapi berbeda fakta (atau menggunakan huruf yang tidak dapat digunakan oleh lingkungan non-unicode) adalah salah, imo. Itu tidak akan membantu pengkodean, dan malah bisa membuat banyak bug. Satu-satunya keuntungan baik: itu akan membuat orang (menyakitkan) menyadari kemungkinan bahwa beberapa kode menggunakan Unicode (dan sangat menyadari Unicode dan representasi yang berbeda) ... Tentang unicode: joelonsoftware.com/articles/Unicode.html
Olivier Dulac
4
@ n2liquid-GuilhermeVieira Hanya jika Anda menganggap semua mesin JavaScript 100% sesuai spesifikasi, yang tidak selalu terjadi - itu pasti tidak ketika saya melakukan penelitian ini. Posting blog yang saya tautkan dengan menyebutkan semua bug browser / mesin yang saya ajukan dan tambal.
Mathias Bynens
117

Dari spesifikasi ECMAScript di bagian 7.6 Nama dan Pengidentifikasi Identifier , pengidentifikasi yang valid didefinisikan sebagai:

Identifier :: 
    IdentifierName but not ReservedWord

IdentifierName :: 
    IdentifierStart 
    IdentifierName IdentifierPart 

IdentifierStart :: 
    UnicodeLetter 
    $ 
    _ 
    \ UnicodeEscapeSequence 

IdentifierPart :: 
    IdentifierStart 
    UnicodeCombiningMark 
    UnicodeDigit 
    UnicodeConnectorPunctuation 
    \ UnicodeEscapeSequence 

UnicodeLetter 
    any character in the Unicode categories Uppercase letter (Lu)”, Lowercase letter (Ll)”, Titlecase letter (Lt)”, 
    Modifier letter (Lm)”, Other letter (Lo)”, or Letter number (Nl)”. 

UnicodeCombiningMark 
    any character in the Unicode categories Non-spacing mark (Mn)” or Combining spacing mark (Mc)” 

UnicodeDigit 
    any character in the Unicode category Decimal number (Nd)” 

UnicodeConnectorPunctuation 
    any character in the Unicode category Connector punctuation (Pc)” 

UnicodeEscapeSequence 
    see 7.8.4. 

HexDigit :: one of 
    0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

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 ):

  • Huruf besar (Lu)
  • Huruf kecil (Ll)
  • Titlecase letter (Lt)
  • Surat pengubah (Lm)
  • Surat lainnya (Lo)
  • Nomor surat (Nl)

Ini saja menyumbang beberapa kemungkinan gila - contoh kerja . Jika tidak bekerja di semua browser, maka sebut itu bug, karena itu seharusnya.

var  = "something";
var ĦĔĽĻŎ = "hello";
var 〱〱〱〱 = "less than? wtf";
var जावास्क्रिप्ट = "javascript"; // ok that's JavaScript in hindi
var KingGeorge = "Roman numerals, awesome!";
Anurag
sumber
1
Bisakah Anda menyalin contoh baris Anda ke halaman Kode Rosetta ini , yang saat ini tidak memiliki contoh JavaScript?
Walter Tross
73

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.

Anthony Mills
sumber
71
Saya mungkin akan merencanakan untuk membunuh co-developer yang menggunakan karakter unicode dalam nama labelnya. / Pidato ironis
Erik Reppen
12
romkyns, saya tidak berpikir "nama pengenal karakter Unicode" akan dimasukkan dalam "JavaScript: The Good Parts", dan karena itu, saya lebih suka mengabaikan keberadaan mereka. Namun, saya telah menambahkan penafian atas jawaban saya untuk keuntungan Anda.
Anthony Mills
11
Mengenai Encodings: silakan lakukan karakter non-ASCII, setidaknya dalam string literal Anda. Kita harus menghilangkan semua perangkat lunak bodoh yang membuat penyandian "kacau sepanjang waktu". Suatu kebahagiaan untuk mengetikkan Console.WriteLine("привет")C # dan membuatnya benar-benar berfungsi !
Roman Starkov
14
Lihat, @Timwi, terutama ketika Anda sedang menulis perpustakaan (seperti kata Richard), itu baik untuk tidak memaksa pengguna Anda ke Alt-blah omong kosong atau copy'n'pasting. Juga, untuk hal-hal Anda sendiri, Anda mungkin baik-baik saja berurusan dengan gangguan yang muncul ketika Anda mengalami bug browser atau server proxy atau apa pun, tetapi membuat pengguna perpustakaan Anda berurusan dengan hal-hal itu tidak keren. Jawaban yang bagus menjawab "apa yang harus saya lakukan" lebih dari sekedar berurusan dengan pertanyaan yang ada. Jadi ya, saya ingin membantu orang. Saya tidak akan memasukkan informasi yang tidak berguna dan berbahaya, kecuali saya berkata "oh, dan jangan lakukan ini."
Anthony Mills
37
@Tchalvak Untuk kode yang baru saja Anda gunakan, itu mungkin baik-baik saja, menggunakan Ʒ sebagai nama perpustakaan utama Anda. (Oh, Anda pikir itu angka 3? Maaf, ini sebenarnya U + 01B7 Huruf Latin Ezh! Atau З, Huruf Huruf Besar Bahasa Cyrillic?) Jika Anda akan menulis perpustakaan yang mungkin digunakan oleh orang lain Namun, mungkin yang terbaik adalah tetap menggunakan ASCII.
Anthony Mills
18

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:

  • Surat: Lu , Ll , Lt , Lm , Lo , Nl
    (digabungkan dalam regex di atas sebagai "L")
  • Menggabungkan tanda ("pengubah"): Mn , Mc
  • Digit: Nd
  • Konektor: Pc

* 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.)

danorton
sumber
Sepertinya saya tidak bisa membuat regex ini benar-benar berfungsi. "test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === nullmeskipun "test" adalah nama variabel JS yang valid
David Murdoch
Maaf, tetapi JavaScript tidak mendukung regex ini. Saya telah menambahkan catatan untuk menjelaskan.
danorton
5
Perlu dicatat bahwa regex kedua Anda memiliki beberapa positif palsu. Karakter Unicode tambahan (mis. U + 2F800 CJK Compatibility Ideograph , yang tercantum dalam kategori [Lo]) tidak diizinkan dalam nama pengidentifikasi , karena JavaScript menafsirkannya sebagai dua bagian pengganti individu (mis. \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.
Mathias Bynens
1
ES6 secara resmi mendefinisikan pengidentifikasi yang valid menggunakan kelas karakter yang dimaksudkan secara tegas untuk tujuan ini (digunakan dalam pemrograman) - tidak yakin apakah ini benar sebelumnya - artinya Anda dapat membuat regex ini sedikit lebih mudah dibaca, jika tidak mempertimbangkan kata-kata yang dicadangkan oleh akun - atau setidaknya itu akan terjadi jika bukan karena urutan pelarian Unicode sekarang juga berlaku dalam pengidentifikasi! Ini tepat sesuai dengan spesifikasi ES6: (?: [\ P {ID_Start} \ $ _] | \\ u (?: [\ DA-Fa-f] {4} | \ {[\ dA-Fa-f ] + \})) ([\ p {ID_Continue} \ $ _ \ u200C \ u200D] | \\ u (?: [\ dA-Fa-f] {4} | \ {[\ dA-Fa-f] + \})) *
Titik koma
14

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.

Yuvalik
sumber
Kesalahan koneksi dan hanya 404 yang saya dapatkan untuk setiap hasil yang relevan ketika googling untuk ("kategori unicode") ... :(
Calmarius
13

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 digunakan jQuery. Untuk melakukan ini, cukup atur:

jQuery.noConflict();

Halaman ini menjelaskan cara melakukan ini.

Massa yang Terancam Punah
sumber
Ini benar-benar benar, tetapi saya memberikan jawaban kepada Anthony yang menjawab 0,012123413124 milidetik sebelum Anda. Maaf.
Richard Clayton
8
@ Richard: Tidak, itu tidak sepenuhnya benar. Lihat jawaban @Yuvalik dan @ Anurag.
Tim Down
@ EndangeredMassa mengapa menggunakan variabel "_name"? mengapa tidak menyebutkan nama saja?
Tomasz Waszczyk
9

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 .

^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\u200C\u200D]*+$

Selain itu, nama tidak boleh salah satu dari kata-kata yang dipesan berikut ini.

break, do, instanceof, typeof, case, else, baru, var, catch, akhirnya, return, void, continue, for, switch, while, debugger, function, this, with, default, if, throw, delete, in, coba, kelas, enum, meluas, super, const, ekspor, impor, mengimplementasikan, biarkan, pribadi, publik, hasil, antarmuka, paket, dilindungi, statis, null, benar, salah

Svish
sumber
Regex ini bukan regex JS yang valid. Saya pikir Anda berarti: ^[$_\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}]*$/) === nullmeskipun "test" adalah nama variabel JS yang valid
David Murdoch
Tidak, saya cukup yakin saya maksudkan apa yang saya tulis :) Pertanyaannya, seperti yang saya mengerti, hanya bertanya apa nama fungsi javascript yang valid, bukan bagaimana regex untuk itu akan secara khusus javascript. Saya membuatnya di RegexBuddy dan saya menggunakannya dalam PHP pada halaman contoh yang saya tautkan. Bekerja dengan baik, dan testditerima juga.
Svish
3
@DavidMurdoch Saya telah menulis ekspresi reguler kompatibel JavaScript 11.335 karakter yang dapat digunakan untuk memvalidasi pengidentifikasi (alias. Nama variabel). Lihat jawaban saya .
Mathias Bynens
3
@Vish Perlu dicatat bahwa regex Anda memiliki beberapa positif palsu. Karakter Unicode tambahan (mis. U + 2F800 CJK Compatibility Ideograph , yang tercantum dalam kategori [Lo]) tidak diizinkan dalam nama pengidentifikasi , karena JavaScript menafsirkannya sebagai dua bagian pengganti individu (mis. \uD87E\uDC00) Yang tidak cocok dengan salah satu dari Unicode yang diizinkan. kategori. Regex Anda, bagaimanapun, akan memungkinkan karakter seperti itu.
Mathias Bynens
2
@ Svish Well yeah, dengan menuliskan rentang sendiri, seperti yang saya lakukan :) Perhatikan bahwa regex Anda juga tidak memperhitungkan dengan eval, arguments, NaN, Infinitydan undefinedkasus tepi .
Mathias Bynens
6

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.

Miguel Ventura
sumber
4

jika ekspresi reguler bukan suatu keharusan, bukankah lebih baik hanya meminta browser untuk memutuskan menggunakan eval?

function isValidVarName( name ) {
    try {
        // Update, previoulsy it was
        // eval('(function() { var ' + name + '; })()');
        Function('var ' + name);
    } catch( e ) {
        return false;
    }
    return true;
}

isValidVarName('my_var');     // true
isValidVarName('1');          // false
Anas Nakawa
sumber
6
Tidak, tidak akan. xss = alert("I'm in your vars executin mah scrip's");;;;;misalnya bukan nama variabel javascript yang valid.
1j01
6
xss;alert("try again");
1j01
1
Itu ide yang cukup pintar, meskipun kerentanan serangan XSS.
Sikat gigi
@ 1j01 Bagaimana mengganti namedengan (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.
royhowie
2
Nah, kalau begitu isValidVarName('aler(t')menjadi benar. Dan isValidVarName('_;;;')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 \ns dan \rs 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
1j01
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.

DanBrianWhite
sumber
Bisakah Anda membuktikan ini dengan beberapa kode sumber yang gagal? Tampaknya tidak melakukan apa pun di Firefox.
Sikat gigi
Berikut adalah jsfiddle yang memberi peringatan ketika variabel "_content" tidak "tidak terdefinisi" dan ketika "_content" diatur oleh FireFox, ia disetel ke sama dengan "window.content" jsfiddle.net/R2qvt/3
DanBrianWhite
1

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 XXXkarena lebih sulit untuk keluar.

    function isValidVarName( name ) {
    try {
        return name.indexOf('}') === -1 && eval('(function() { a = {' + name + ':1}; a.' + name + '; var ' + name + '; }); true');
    } catch( e ) {
        return false;
    }
    return true;
}

// so we can see the test code
var _eval = eval;
window.eval = function(s) {
    console.log(s);
    return _eval(s);
}

console.log(isValidVarName('name'));
console.log(isValidVarName('$name'));
console.log(isValidVarName('not a name'));
console.log(isValidVarName('a:2,b'));
console.log(isValidVarName('"a string"'));

console.log(isValidVarName('xss = alert("I\'m in your vars executin mah scrip\'s");;;;;'));
console.log(isValidVarName('_;;;'));
console.log(isValidVarName('_=location="#!?"'));

console.log(isValidVarName('ᾩ'));
console.log(isValidVarName('ĦĔĽĻŎ'));
console.log(isValidVarName('〱〱〱〱'));
console.log(isValidVarName('जावास्क्रिप्ट'));
console.log(isValidVarName('KingGeorgeⅦ'));
console.log(isValidVarName('}; }); alert("I\'m in your vars executin\' mah scripts"); true; // yeah, super valid'));
console.log(isValidVarName('if'));
cleong
sumber
1
Jangan coba-coba. isValidVarName('}; }); alert("I\'m in your vars executin\' mah scripts"); true; // yeah, super valid');
1j01
1
@ 1j01, Agh, saya lupa tentang komentar kode. Saya berharap ketidakseimbangan tanda kurung saja bisa menjaga kode dari berjalan. Pemeriksaan sederhana untuk }mencegah hal itu.
Bersihkan
isValidVarName("delete") === true
1j01
1

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 ....

Allain Lalonde
sumber