Quali caratteri sono validi per i nomi delle variabili JavaScript?


557

Quali caratteri possono essere usati per nominare una variabile JavaScript?

Voglio creare una piccola "libreria di estensioni" per i miei utenti non JavaScript qui al lavoro (che sembrano tutti schizzinosi quando si tratta della lingua). Adoro il modo in cui jQuery e Prototype utilizzano entrambi il $simbolo del dollaro e, poiché utilizzo jQuery, sto cercando un altro simpatico simbolo a carattere singolo da utilizzare.

Mi rendo conto che potrei semplicemente provare un certo numero di personaggi, ma spero di restringere il mio elenco di personaggi per cominciare (in considerazione della futura integrazione con un'altra libreria popolare, forse).


44
NO. Le lettere Unicode sono accettabili. Prova π, ad esempio.
nalply

14
Sebbene le lettere unicode siano accettabili nei nomi delle variabili, l'uso dell'unicode nel codice può essere problematico . Suggerirei di non usarli nei nomi delle variabili se riesci a cavartela senza di loro.
Gary S. Weaver,

F # è un nome variabile valido? Sto costruendo una piccola libreria javascript funzionale e desidero utilizzare F # per il nome del suo modulo. Una tipica chiamata di funzione sarebbe simile a questa: F # .partial (fn, ... presetArgs);
Jules Manson,

@JulesManson No, perché il simbolo della sterlina è riservato per altri usi.
Aidan Lovelace,

@JulesManson A proposito, il nome F # è già preso da Microsoft da .NET
Luke the Geek

Risposte:


986

Per citare nomi di variabili JavaScript validi , il mio articolo riassume le sezioni specifiche relative:

Un identificatore deve iniziare con $, _o qualsiasi carattere nelle categorie Unicode “Lettere maiuscole (Lu)” , “Lettera minuscola (Ll)” , “Lettera maiuscola (Lt)” , “Lettera modificatore (Lm)” , “Altra lettera ( Lo) " o " Numero lettera (Nl) " .

Il resto della stringa può contenere gli stessi caratteri, oltre a qualsiasi carattere non-joiner U + 200C di larghezza zero , caratteri del joiner U + 200D di larghezza zero e caratteri nelle categorie Unicode “Segno non spaziato (Mn)” , “Combinazione spaziatura mark (Mc) " , " Numero decimale (Nd) " o " Punteggiatura connettore (Pc) " .

Ho anche creato uno strumento che ti dirà se qualsiasi stringa che inserisci è un nome di variabile JavaScript valido secondo ECMAScript 5.1 e Unicode 6.1:

Convalida nome variabile JavaScript


PS Per darti un'idea della risposta sbagliata di Anthony Mills: se dovessi riassumere tutte queste regole in una singola espressione regolare solo ASCII per JavaScript, sarebbe lunga 11.236 caratteri . Ecco qui:

// 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]*$/

31
Ti darò credito per il tempo necessario per generare questo.
Richard Clayton,

18
@marsbear Mi è capitato di aver scritto un articolo anche su questo: mathiasbynens.be/notes/javascript-properties E anche uno strumento: mothereff.in/js-properties#12e34 Ecco una mia risposta Stack Overflow pertinente .
Mathias Bynens,

2
Dannazione, quindi non posso diventare intelligente e usarlo ¢per completare $... vabbè ...)-:
hippietrail

3
È vero (e una risposta fantastica). Tuttavia questo non lo rende giusto: offuscare il codice usando lettere simili dall'aspetto simile ma in realtà diverse (o usando lettere che un ambiente non unicode NON può usare) è Wrong, imo. Non aiuterà la codifica e può invece creare numerosi bug. L'unico aspetto positivo: renderà le persone (dolorose) consapevoli di quella possibilità che un po 'di codice usi Unicode (e dolorosamente consapevole di Unicode e delle sue diverse rappresentazioni) ... Informazioni su Unicode: joelonsoftware.com/articles/Unicode.html
Olivier Dulac

4
@ n2liquid-GuilhermeVieira Solo se si presume che tutti i motori JavaScript siano conformi al 100% alle specifiche, il che non è sempre il caso - non era certo quando ho fatto questa ricerca. Il post sul blog a cui ho collegato menziona tutti i bug del browser / motore che ho archiviato e corretto.
Mathias Bynens,

117

Dalla specifica ECMAScript nella sezione 7.6 Nomi identificativi e identificatori , un identificatore valido è definito come:

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

che crea molte opportunità per nominare le variabili e anche nel golf. Proviamo alcuni esempi.

Un identificatore valido potrebbe iniziare con una UnicodeLetter, $, _, o \ UnicodeEscapeSequence. Una lettera unicode è qualsiasi carattere di queste categorie ( vedi tutte le categorie ):

  • Lettera maiuscola (Lu)
  • Lettera minuscola (Ll)
  • Lettera di titolo (Lt)
  • Lettera modificatore (Lm)
  • Altra lettera (Lo)
  • Numero lettera (Nl)

Questo da solo spiega alcune possibilità pazze - esempi funzionanti . Se non funziona in tutti i browser, chiamalo un bug, perché dovrebbe.

var  = "something";
var ĦĔĽĻŎ = "hello";
var 〱〱〱〱 = "less than? wtf";
var जावास्क्रिप्ट = "javascript"; // ok that's JavaScript in hindi
var KingGeorge = "Roman numerals, awesome!";

1
Potresti per favore copiare le tue righe di esempio in questa pagina del codice Rosetta , che al momento manca di un esempio JavaScript?
Walter Tross,

73

In sostanza, in forma espressione regolare: [a-zA-Z_$][0-9a-zA-Z_$]*. In altre parole, il primo carattere può essere una lettera o _ o $ e gli altri caratteri possono essere lettere o _ o $ o numeri.

Nota: mentre altre risposte hanno sottolineato che è possibile utilizzare i caratteri Unicode negli identificatori JavaScript, la domanda effettiva era "Quali caratteri devo usare per il nome di una libreria di estensioni come jQuery?" Questa è una risposta a questa domanda. Puoi usare i caratteri Unicode negli identificatori, ma non farlo. Le codifiche vengono sempre rovinate. Mantieni i tuoi identificatori pubblici nell'intervallo 32-126 ASCII dove sono al sicuro.


71
Probabilmente avrei complottato per assassinare un co-sviluppatore che usava personaggi unicode nei nomi delle sue etichette. / discorso a malapena ironico
Erik Reppen,

12
Romkyns, non credo che i "nomi degli identificatori di caratteri Unicode" sarebbero mai stati inclusi in "JavaScript: le parti buone" e, come tale, preferisco ignorare la loro esistenza. Tuttavia, ho aggiunto un disclaimer alla mia risposta a tuo vantaggio.
Anthony Mills,

11
Per quanto riguarda la Codifiche: si prega di fare personaggi uso non ASCII, almeno nelle stringhe letterali. Dobbiamo eliminare tutto il software stupido che ottiene "incasinato tutto il tempo". Che felicità digitare semplicemente Console.WriteLine("привет")C # e farlo funzionare davvero !
Roman Starkov,

14
Senti, @Timwi, specialmente quando stai scrivendo una libreria (come Richard dice che lo è), è gentile non forzare i tuoi utenti a fare schifo o copiare 'Alt-blah'. Inoltre, per la tua roba, potresti andare bene a gestire i fastidi che sorgono quando incontri bug del browser o del server proxy o altro, ma fare in modo che gli utenti della tua libreria gestiscano quella roba non è bello. Una buona risposta risponde "cosa dovrei fare" più di una semplice questione. Quindi sì, voglio aiutare le persone. Non includerò le informazioni inutili e pericolose, a meno che non dica "oh, e non farlo."
Anthony Mills,

37
@Tchalvak Per il codice che stai solo usando, probabilmente va bene, usando Ʒ come nome della tua libreria principale. (Oh, hai pensato che fosse un 3? Quindi scusa, in realtà è U + 01B7 lettera maiuscola latina Ezh! O era З, lettera maiuscola cirillica Ze?) Se hai intenzione di scrivere una biblioteca che potrebbe essere utilizzata da altre persone , tuttavia, è probabilmente meglio attenersi ad ASCII.
Anthony Mills,

18

Prima di JavaScript 1.5: ^[a-zA-Z_$][0-9a-zA-Z_$]*$

In inglese: deve iniziare con un segno di dollaro, un trattino basso o una delle lettere dell'alfabeto di 26 caratteri, maiuscolo o minuscolo. I caratteri successivi (se presenti) possono essere uno di quelli o una cifra decimale.

JavaScript 1.5 e versioni successive * :^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$

Questo è più difficile da esprimere in inglese, ma è concettualmente simile alla vecchia sintassi con l'aggiunta che le lettere e le cifre possono provenire da qualsiasi lingua. Dopo il primo carattere, sono consentiti anche caratteri di sottolineatura aggiuntivi (chiamati collettivamente "connettori") e segni di combinazione di caratteri aggiuntivi ("modificatori"). (Altri simboli di valuta non sono inclusi in questo set esteso.)

JavaScript 1.5 e versioni successive consentono anche sequenze di escape Unicode, a condizione che il risultato sia un carattere che sarebbe consentito nell'espressione regolare sopra.

Gli identificatori non devono inoltre essere una parola riservata corrente o considerata per un uso futuro.

Non esiste un limite pratico alla lunghezza di un identificatore. (I browser variano, ma avrai tranquillamente 1000 caratteri e probabilmente molti più ordini di grandezza di quello.)

Collegamenti alle categorie di personaggi:

  • Lettere: Lu , Ll , Lt , Lm , Lo , Nl
    (combinate nella regex sopra come "L")
  • Combinazione di segni ("modificatori"): Mn , Mc
  • Cifre: Nd
  • Connettori: Pc

* nb Questa regex di Perl ha lo scopo di descrivere solo la sintassi: non funzionerà in JavaScript, che non include (ancora) il supporto per le proprietà Unicode. (Esistono alcuni pacchetti di terze parti che dichiarano di aggiungere tale supporto.)


Non riesco a far funzionare davvero questa regex. "test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === nullanche se "test" è un nome di variabile JS valido
David Murdoch,

Siamo spiacenti, ma JavaScript non supporta questa regex. Ho aggiunto una nota per chiarire.
danorton,

5
Va notato che il tuo secondo regex ha alcuni falsi positivi. I caratteri Unicode supplementari (ad es . L'ideografo di compatibilità U + 2F800 CJK , che è elencato nella categoria [Lo]) non sono consentiti nei nomi degli identificatori , poiché JavaScript li interpreta come due metà surrogate individuali (ad es. \uD87E\uDC00) Che non corrispondono a nessuno degli Unicode consentiti categorie. La tua regex, tuttavia, consentirebbe un personaggio del genere. Inoltre, mancano U + 200C e U + 200D.
Mathias Bynens,

1
ES6 definisce formalmente identificatori validi usando le classi di caratteri espressamente intese a questo scopo (utilizzare nella programmazione) - non sono sicuro che ciò fosse vero in precedenza - il che significa che è possibile rendere un regex leggermente più leggibile, se non si tiene conto delle parole riservate - oppure almeno lo sarebbe se non fosse per il fatto che le sequenze di escape Unicode sono ora valide anche negli identificatori! Questo è esatto secondo le specifiche 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] + \})) *
Punto

14

In realtà, ECMAScript dice a pagina 15: che un identificatore può iniziare con un $, un carattere di sottolineatura o un UnicodeLetter, e quindi continua (appena sotto quello) per specificare che un UnicodeLetter può essere qualsiasi carattere delle categorie unicode, Lo, Ll , Lu, Lt, Lm e Nl. E quando guarderai quelle categorie vedrai che questo apre molte più possibilità rispetto alle sole lettere latine. Basta cercare "categorie Unicode" su Google e puoi trovarle.


Errori di connessione e 404 sono tutto ciò che ottengo per ogni risultato rilevante quando si cerca su Google ("categorie unicode") ... :(
Calmarius,

13

Variabili Javascript

Puoi iniziare una variabile con qualsiasi lettera $, o _carattere. Finché non inizia con un numero, puoi includere anche numeri.

Inizio: [a-z], $, _

Contenere: [a-z], [0-9], $, _

jQuery

Puoi usarlo _per la tua libreria in modo che rimanga fianco a fianco con jQuery. Tuttavia, esiste una configurazione che è possibile impostare in modo che jQuery non verrà utilizzata $. Invece utilizzerà jQuery. Per fare ciò, basta impostare:

jQuery.noConflict();

Questa pagina spiega come farlo.


Questo è assolutamente corretto, ma ho dato la risposta ad Anthony che ha risposto .02123413124 millisecondi prima di te. Scusate.
Richard Clayton,

8
@Richard: No, non è assolutamente corretto. Vedi le risposte di @Yuvalik e @ Anurag.
Tim Down

@EndangeredMassa perché usare la variabile "_name"? perché non solo il nome?
Tomasz Waszczyk il

9

La risposta accettata escluderebbe molti identificatori validi , per quanto posso vedere. Ecco un'espressione regolare che ho messo insieme che dovrebbe seguire le specifiche (vedere il capitolo 7.6 sugli identificatori). L'ho creato usando RegexBuddy e puoi trovare un'esportazione della spiegazione su http://samples.geekality.net/js-identifiers .

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

Inoltre, il nome non può essere una delle seguenti parole riservate.

break, do, instanceof, typeof, case, else, new, var, catch, infine, return, void, continue, for, switch, while, debugger, function, this, with, default, if, throw, delete, in, provare, classe, enum, estende, super, const, esportazione, importazione, implementa, let, privato, pubblico, rendimento, interfaccia, pacchetto, protetto, statico, null, vero, falso


Questa regex non è una regex JS valida. Credo che volevi dire: ^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\u200C\u200D]*$. Ora, anche con la correzione, non riesco a far funzionare davvero questa regex. "test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === nullanche se "test" è un nome di variabile JS valido
David Murdoch,

No, sono abbastanza sicuro di intendere quello che ho scritto :) La domanda, come ho capito, mi ha solo chiesto quale sia un nome di funzione javascript valido, non come sarebbe una regex in quel modo specificamente javascript. L'ho fatto in RegexBuddy e lo sto usando in PHP nella pagina di esempio a cui mi collego. Funziona alla grande, ed testè anche accettato.
Svish,

3
@DavidMurdoch Ho scritto un'espressione regolare compatibile con JavaScript di 11.335 caratteri che può essere utilizzata per convalidare gli identificatori (ovvero nomi di variabili). Vedere la mia risposta .
Mathias Bynens,

3
@Svish Va notato che il tuo regex ha alcuni falsi positivi. I caratteri Unicode supplementari (ad es . L'ideografo di compatibilità U + 2F800 CJK , che è elencato nella categoria [Lo]) non sono consentiti nei nomi degli identificatori , poiché JavaScript li interpreta come due metà surrogate individuali (ad es. \uD87E\uDC00) Che non corrispondono a nessuno degli Unicode consentiti categorie. La tua regex, tuttavia, consentirebbe un personaggio del genere.
Mathias Bynens,

2
@Svish Beh, sì, scrivendo le gamme da soli, come ho fatto io :) Nota che l'espressione regolare, inoltre, non tiene conto delle eval, arguments, NaN, Infinitye undefinedcasi limite .
Mathias Bynens,

6

Le variabili Javascript possono avere lettere, cifre, simboli di dollaro ($) e caratteri di sottolineatura (_). Non possono iniziare con le cifre.

Di solito le librerie usano $e _come scorciatoie per le funzioni che utilizzerai ovunque. Sebbene i nomi $o _non siano significativi, sono utili per la loro carenza e poiché utilizzerai la funzione ovunque dovresti sapere cosa significano.

Se la tua libreria non consiste nell'ottenere che una singola funzione venga utilizzata ovunque, ti consiglio di usare nomi più significativi in ​​quanto quelli aiuteranno te e gli altri a capire cosa sta facendo il tuo codice senza compromettere necessariamente la gentilezza del codice sorgente .

Ad esempio, potresti dare un'occhiata alla fantastica libreria DateJS e allo zucchero sintetico che consente senza la necessità di alcun simbolo o variabili con nome breve .

Dovresti prima ottenere il tuo codice per essere pratico e solo dopo aver provato a renderlo carino.


4

nel caso in cui le espressioni regolari non siano indispensabili, non sarebbe meglio chiedere al browser di decidere di utilizzarlo 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

6
No, non lo farebbe. xss = alert("I'm in your vars executin mah scrip's");;;;;ad esempio non è un nome di variabile javascript valido.
1j01,

6
xss;alert("try again");
gennaio

1
È un'idea abbastanza intelligente, nonostante la vulnerabilità dell'attacco XSS.
Spazzolino da denti

@ 1j01 Che ne dici di sostituire namecon (typeof name === "string")? name.replace(/\(|\)/,"") : "_noXSS" )? Se è una stringa, sostituirà le parentesi (sicuramente non consentite nelle variabili), quindi penso che eseguire qualsiasi cosa sarebbe quasi impossibile.
Royhowie,

2
Bene, allora isValidVarName('aler(t')diventa vero. E isValidVarName('_;;;')rimane vero. Ma si potrebbe verificare in partenza se abbinato qualcosa di simile /[;,\(\)]/, ma poi è ancora possibile eseguire _=location="#!?"in modo da aggiungere =alla lista, ma è ancora possibile eseguire '_\ndelete foo'(che supera il test come un nome di variabile valido) in modo da avere escludere \ns e \rs e forse qualche newline unicode? Ma "$" non è un identificatore valido, quindi devi escludere tutti gli spazi bianchi ... È una battaglia persa. Penso che per quanto posso andare contro me stesso conif(/[;,\(\)=\s]/.exec(name))return!1
1j01

1

Ecco un breve suggerimento per la creazione di nomi di variabili. Se si desidera che la variabile non sia in conflitto quando viene utilizzata in FireFox, non utilizzare il nome della variabile " _content " poiché il nome di questa variabile è già utilizzato dal browser. L'ho scoperto nel modo più difficile e ho dovuto cambiare tutti i luoghi in cui ho usato la variabile "_content" in una grande applicazione JavaScript.


Puoi dimostrarlo con un codice sorgente che non riesce? Non sembra fare nulla in Firefox.
Spazzolino da denti

Ecco un jsfiddle che avvisa quando la variabile "_content" non è "indefinita" e quando "_content" è impostato da FireFox, è impostato su uguale "window.content" jsfiddle.net/R2qvt/3
DanBrianWhite

1

Ho preso l'idea di Anas Nakawa e l'ho migliorata. Prima di tutto, non vi è alcun motivo per eseguire effettivamente la funzione dichiarata. Vogliamo sapere se analizza correttamente, non se il codice funziona. In secondo luogo, un oggetto letterale è un contesto migliore per il nostro scopo rispetto a var XXXquando è più difficile uscirne.

    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'));

1
Non provarci nemmeno. isValidVarName('}; }); alert("I\'m in your vars executin\' mah scripts"); true; // yeah, super valid');
1o

1
@ 1j01, Agh, ho dimenticato il commento al codice. Speravo che il solo sbilanciamento delle parentesi potesse impedire l'esecuzione del codice. Un semplice controllo per }dovrebbe precluderlo.
Cleong,

isValidVarName("delete") === true
1o

1

Ha scritto un'area di lavoro glitch che scorre su tutti i punti di codice ed emette il carattere se eval('var ' + String.fromCodePoint(#) + ' = 1')funziona.

Continua semplicemente ad andare, andare e andare ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.