Welche Zeichen sind für JavaScript-Variablennamen gültig?

557

Welche Zeichen können zum Benennen einer JavaScript-Variablen verwendet werden?

Ich möchte hier bei der Arbeit eine kleine "Erweiterungsbibliothek" für meine Nicht-JavaScript-Benutzer erstellen (die alle in Bezug auf die Sprache zimperlich zu sein scheinen). Ich finde es toll, wie sowohl jQuery als auch Prototype das $Dollarzeichen verwenden, und da ich jQuery verwende, suche ich nach einem weiteren schönen Symbol für einzelne Zeichen.

Mir ist klar, dass ich nur eine Reihe von Zeichen testen konnte, aber ich hoffe, dass ich zunächst meine Liste der Zeichen eingrenzen kann (im Hinblick auf die zukünftige Integration in eine andere beliebte Bibliothek vielleicht).

Richard Clayton
quelle
44
NEIN. Unicode-Buchstaben sind akzeptabel. Probieren Sie zum Beispiel π aus.
Nalply
14
Obwohl Unicode-Buchstaben in Variablennamen akzeptabel sind, kann die Verwendung von Unicode im Code problematisch sein . Ich würde vorschlagen, sie nicht in Variablennamen zu verwenden, wenn Sie ohne sie auskommen können.
Gary S. Weaver
Ist F # ein gültiger Variablenname? Ich baue eine kleine funktionale Javascript-Bibliothek auf und möchte F # als Modulnamen verwenden. Ein typischer Funktionsaufruf würde folgendermaßen aussehen: F # .partial (fn, ... presetArgs);
Jules Manson
@JulesManson Nein, da das Pfundsymbol für andere Zwecke reserviert ist.
Aidan Lovelace
@ JulesManson Übrigens, der Name F # wurde bereits von Microsoft aus .NET übernommen
Luke the Geek

Antworten:

986

Um gültige JavaScript-Variablennamen zu zitieren, fasse ich die relevanten Spezifikationsabschnitte zusammen:

Ein Bezeichner muss mit beginnen $, _oder einem beliebigen Zeichen in den Unicode - Kategorien „Großbuchstaben (Lu)“ , „Kleinbuchstabe (Ll)“ , „Titlecase Brief (Lt)“ , „Modifier Brief (Lm)“ , „Anderer Brief ( Lo) ” oder “ Buchstabennummer (Nl) ” .

Der Rest der Zeichenfolge kann dieselben Zeichen sowie alle Nicht-Joiner- Zeichen mit U + 200C-Nullbreite , U + 200D -Joiner- Zeichen mit Nullbreite und Zeichen in den Unicode-Kategorien „Nicht-Abstandsmarkierung (Mn)“ und „Abstandskombination“ enthalten Markieren Sie (Mc) “ , „ Dezimalstellennummer (Nd) “ oder „ Connector-Interpunktion (Pc) “ .

Ich habe auch ein Tool erstellt , mit dem Sie feststellen können, ob eine von Ihnen eingegebene Zeichenfolge ein gültiger JavaScript-Variablenname gemäß ECMAScript 5.1 und Unicode 6.1 ist:

Validator für den Namen von JavaScript-Variablen


PS Um Ihnen eine Vorstellung davon zu geben, wie falsch die Antwort von Anthony Mills lautet: Wenn Sie alle diese Regeln in einem einzigen regulären ASCII-Ausdruck für JavaScript zusammenfassen würden, wären sie 11.236 Zeichen lang . Hier ist es:

// 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
quelle
31
Ich werde Ihnen die Zeit gutschreiben, die Sie benötigt haben, um dies zu generieren.
Richard Clayton
18
@marsbear Ich habe zufällig auch einen Artikel darüber geschrieben: mathiasbynens.be/notes/javascript-properties Und auch ein Tool: momeff.in/js-properties#12e34 Hier ist eine relevante Antwort von Stack Overflow von mir.
Mathias Bynens
2
Verdammt, also kann ich nicht schlau werden und mich ¢ergänzen $... )-:
na ja
3
Es ist wahr (und eine tolle Antwort). Dies macht es jedoch nicht richtig: Die Verschleierung von Code durch die Verwendung ähnlich aussehender, aber tatsächlich unterschiedlicher Buchstaben (oder durch die Verwendung von Buchstaben, die in einer Nicht-Unicode-Umgebung NICHT verwendet werden können) ist falsch, imo. Es hilft nicht beim Codieren und kann stattdessen zahlreiche Fehler verursachen. Der einzig gute Vorteil: Es macht die Leute (schmerzhaft) auf diese Möglichkeit aufmerksam, dass ein Code Unicode verwendet (und schmerzlich auf Unicode und seine verschiedenen Darstellungen aufmerksam wird) ... Über Unicode: joelonsoftware.com/articles/Unicode.html
Olivier Dulac
4
@ n2liquid-GuilhermeVieira Nur wenn Sie davon ausgehen, dass alle JavaScript-Engines 100% spezifikationskonform sind, was nicht immer der Fall ist - es war sicher nicht so, als ich diese Forschung durchgeführt habe. Der Blog-Beitrag, auf den ich verlinkt habe, erwähnt alle Browser- / Engine-Fehler, die ich eingereicht und gepatcht habe.
Mathias Bynens
117

Aus der ECMAScript-Spezifikation in Abschnitt 7.6 Bezeichnernamen und Bezeichner wird ein gültiger Bezeichner wie folgt definiert:

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

Dies schafft viele Möglichkeiten für die Benennung von Variablen und auch für das Golfen. Versuchen wir einige Beispiele.

Ein gültiger Bezeichner könnte beginnen entweder mit einem UnicodeLetter, $, _, oder \ UnicodeEscapeSequence. Ein Unicode-Buchstabe ist ein beliebiges Zeichen aus diesen Kategorien ( siehe alle Kategorien ):

  • Großbuchstabe (Lu)
  • Kleinbuchstaben (Ll)
  • Titelbuchstabe (Lt)
  • Modifikatorbuchstabe (Lm)
  • Anderer Brief (Lo)
  • Buchstabennummer (Nl)

Dies allein erklärt einige verrückte Möglichkeiten - Arbeitsbeispiele . Wenn es nicht in allen Browsern funktioniert, nennen Sie es einen Fehler, weil es sollte.

var  = "something";
var ĦĔĽĻŎ = "hello";
var 〱〱〱〱 = "less than? wtf";
var जावास्क्रिप्ट = "javascript"; // ok that's JavaScript in hindi
var KingGeorge = "Roman numerals, awesome!";
Anurag
quelle
1
Könnten Sie bitte Ihre Beispielzeilen auf diese Rosetta-Codepage kopieren , auf der derzeit kein JavaScript-Beispiel fehlt?
Walter Tross
73

Grundsätzlich in regulärer Ausdrucksform : [a-zA-Z_$][0-9a-zA-Z_$]*. Mit anderen Worten, das erste Zeichen kann ein Buchstabe oder _ oder $ sein, und die anderen Zeichen können Buchstaben oder _ oder $ oder Zahlen sein.

Hinweis: Während andere Antworten darauf hingewiesen haben, dass Sie Unicode-Zeichen in JavaScript-Bezeichnern verwenden können, lautete die eigentliche Frage "Welche Zeichen sollte ich für den Namen einer Erweiterungsbibliothek wie jQuery verwenden?". Dies ist eine Antwort auf diese Frage. Sie können Unicode-Zeichen in Bezeichnern verwenden, tun Sie dies jedoch nicht. Kodierungen werden ständig vermasselt. Bewahren Sie Ihre öffentlichen Kennungen im ASCII-Bereich 32-126 auf, wo dies sicher ist.

Anthony Mills
quelle
71
Ich würde wahrscheinlich planen, einen Mitentwickler zu ermorden, der Unicode-Zeichen in seinen Markennamen verwendet. / kaum ironische Rede
Erik Reppen
12
romkyns, ich glaube nicht, dass "Unicode-Zeichenkennungen" jemals in "JavaScript: The Good Parts" enthalten sein würden, und als solche ziehe ich es vor, ihre Existenz zu ignorieren. Ich habe meiner Antwort jedoch einen Haftungsausschluss zu Ihrem Vorteil hinzugefügt.
Anthony Mills
11
Bitte: In Bezug auf Codierungen tun Verwendung nicht-ASCII - Zeichen, zumindest in Ihrem Stringliterale. Wir müssen all die dumme Software beseitigen, die die Kodierungen "ständig vermasselt". Was für ein Glück, einfach Console.WriteLine("привет")C # einzugeben und es tatsächlich funktionieren zu lassen !
Roman Starkov
14
Schauen Sie, @Timwi, besonders wenn Sie eine Bibliothek schreiben (wie Richard sagt, dass er es ist), ist es nett, Ihre Benutzer nicht zu Alt-Blah-Mist oder Copy'n'Pasting zu zwingen. Auch für Ihre eigenen Sachen können Sie gut mit den Ärgernissen umgehen, die auftreten, wenn Sie auf Browser- oder Proxyserver-Fehler oder was auch immer stoßen, aber die Benutzer Ihrer Bibliothek dazu zu bringen, sich mit diesen Sachen zu befassen, ist nicht cool. Eine gute Antwort beantwortet "Was soll ich tun?" Mehr als nur die Frage zu beantworten. Also ja, ich möchte Menschen helfen. Ich werde die nutzlosen und gefährlichen Informationen nicht einschließen, es sei denn, ich sage "Oh, und tu das nicht."
Anthony Mills
37
@Tchalvak Für Code, den nur Sie verwenden, ist das wahrscheinlich in Ordnung, wenn Sie Ʒ als Hauptbibliotheksnamen verwenden. (Oh, Sie dachten, das wäre eine 3? Tut mir leid, es ist tatsächlich U + 01B7, lateinischer Großbuchstabe Ezh! Oder war es З, kyrillischer Großbuchstabe Ze?) Wenn Sie eine Bibliothek schreiben möchten, die möglicherweise von anderen Personen verwendet wird Es ist jedoch wahrscheinlich am besten, sich an ASCII zu halten.
Anthony Mills
18

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

Auf Englisch: Es muss mit einem Dollarzeichen, einem Unterstrich oder einem Buchstaben im 26-stelligen Alphabet in Groß- oder Kleinbuchstaben beginnen. Nachfolgende Zeichen (falls vorhanden) können eines dieser Zeichen oder eine Dezimalstelle sein.

JavaScript 1.5 und höher * :^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$

Dies ist auf Englisch schwieriger auszudrücken, ähnelt jedoch konzeptionell der älteren Syntax, mit dem Zusatz, dass die Buchstaben und Ziffern aus jeder Sprache stammen können. Nach dem ersten Zeichen sind zusätzliche Unterstrich-ähnliche Zeichen (zusammen als „Konnektoren“ bezeichnet) und zusätzliche Zeichen-Kombinationsmarkierungen („Modifikatoren“) zulässig. (Andere Währungssymbole sind in diesem erweiterten Satz nicht enthalten.)

JavaScript 1.5 und höher erlaubt auch Unicode-Escape-Sequenzen, vorausgesetzt, das Ergebnis ist ein Zeichen, das im obigen regulären Ausdruck zulässig wäre.

Bezeichner dürfen auch kein aktuell reserviertes Wort sein oder für die zukünftige Verwendung in Betracht gezogen werden.

Es gibt keine praktische Begrenzung für die Länge eines Bezeichners. (Browser variieren, aber Sie haben sicher 1000 Zeichen und wahrscheinlich mehrere Größenordnungen mehr.)

Links zu den Charakterkategorien:

  • Buchstaben: Lu , Ll , Lt , Lm , Lo , Nl
    (im obigen regulären Ausdruck als "L" kombiniert)
  • Kombinieren von Marken ("Modifikatoren"): Mn , Mc
  • Ziffern: Nd
  • Anschlüsse: Pc

* nb Dieser Perl-Regex soll nur die Syntax beschreiben - er funktioniert nicht in JavaScript, das (noch) keine Unterstützung für Unicode-Eigenschaften enthält. (Es gibt einige Pakete von Drittanbietern, die behaupten, solche Unterstützung hinzuzufügen.)

Danorton
quelle
Ich kann nicht scheinen, dass dieser Regex tatsächlich funktioniert. "test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === nullobwohl "test" ein gültiger JS-Variablenname ist
David Murdoch
Entschuldigung, aber JavaScript unterstützt diesen regulären Ausdruck nicht. Ich habe eine Notiz hinzugefügt, um dies zu verdeutlichen.
Danorton
5
Es sollte beachtet werden, dass Ihre zweite Regex einige falsch positive Ergebnisse aufweist. Zusätzliche Unicode-Zeichen (z. B. U + 2F800 CJK-Kompatibilitätsideogramm , das in der Kategorie [Lo] aufgeführt ist) sind in Bezeichnernamen\uD87E\uDC00 nicht zulässig , da JavaScript sie als zwei einzelne Ersatzhälften (z. B. ) interpretiert, die keinem der zulässigen Unicodes entsprechen Kategorien. Ihre Regex würde jedoch einen solchen Charakter zulassen. Außerdem fehlen U + 200C und U + 200D.
Mathias Bynens
1
ES6 definiert formal gültige Bezeichner mithilfe von Zeichenklassen, die ausdrücklich für diesen Zweck bestimmt sind (Verwendung beim Programmieren) - nicht sicher, ob dies zuvor der Fall war - was bedeutet, dass Sie diesen regulären Ausdruck etwas lesbarer machen können, wenn Sie nicht reservierte Wörter berücksichtigen - oder Zumindest wäre es so, wenn nicht die Tatsache gewesen wäre, dass Unicode-Escape-Sequenzen jetzt auch in Bezeichnern gültig sind! Dies ist genau gemäß der ES6-Spezifikation: (?: [\ P {ID_Start} \ $ _] | \\ u (?: [\ DA-Fa-f] {4} | \ {[\ dA-Fa-f ] + \})) ([\ p {ID_Continue} \ $ _ \ u200C \ u200D] | \\ u (?: [\ dA-Fa-f] {4} | \ {[\ dA-Fa-f] + \})) *
Semikolon
14

Tatsächlich sagt ECMAScript auf Seite 15: Dass ein Bezeichner mit einem $, einem Unterstrich oder einem UnicodeLetter beginnen kann, und dann (direkt darunter) angegeben wird, dass ein UnicodeLetter ein beliebiges Zeichen aus den Unicode-Kategorien Lo, Ll sein kann , Lu, Lt, Lm und Nl. Und wenn Sie diese Kategorien nachschlagen, werden Sie feststellen, dass dies viel mehr Möglichkeiten eröffnet als nur lateinische Buchstaben. Suchen Sie einfach in Google nach "Unicode-Kategorien" und Sie können sie finden.

Yuvalik
quelle
Verbindungsfehler und 404's alles, was ich für alle relevanten Ergebnisse bekomme, wenn ich nach ("Unicode-Kategorien")
google
13

Javascript-Variablen

Sie können eine Variable mit einem beliebigen Buchstaben $oder _Zeichen beginnen. Solange es nicht mit einer Zahl beginnt, können Sie auch Zahlen einfügen.

Start: [a-z], $, _

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

jQuery

Sie können _für Ihre Bibliothek verwenden, damit sie neben jQuery steht. Es gibt jedoch eine Konfiguration, die Sie so festlegen können, dass jQuery nicht verwendet wird $. Es wird stattdessen verwendet jQuery. Stellen Sie dazu einfach Folgendes ein:

jQuery.noConflict();

Diese Seite erklärt, wie das geht.

Gefährdete Masse
quelle
Das ist absolut richtig, aber ich habe Anthony die Antwort gegeben, der .02123413124 Millisekunden vor Ihnen geantwortet hat. Es tut uns leid.
Richard Clayton
8
@ Richard: Nein, das ist nicht absolut richtig. Siehe die Antworten von @Yuvalik und @ Anurag.
Tim Down
@EndangeredMassa warum Variable "_name" verwenden? warum nicht einfach benennen?
Tomasz Waszczyk
9

Die akzeptierte Antwort würde , soweit ich sehen kann , viele gültige Kennungen ausschließen . Hier ist ein regulärer Ausdruck, den ich zusammengestellt habe und der der Spezifikation folgen sollte (siehe Kapitel 7.6 zu Bezeichnern). Erstellt es mit RegexBuddy und Sie können einen Export der Erklärung unter http://samples.geekality.net/js-identifiers finden .

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

Außerdem darf der Name keines der folgenden reservierten Wörter sein.

break, do, instanceof, typeof, case, else, new, var, catch, finally, return, void, continue, for, switch, while, debugger, function, this, with, default, if, throw, delete, in, try, class, enum, erweitert, super, const, exportieren, importieren, implementiert, let, privat, öffentlich, Ausbeute, Schnittstelle, Paket, geschützt, statisch, null, wahr, falsch

Svish
quelle
Diese Regex ist keine gültige JS-Regex. Ich denke du meintest : ^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\u200C\u200D]*$. Selbst mit der Korrektur kann ich diesen regulären Ausdruck nicht dazu bringen, tatsächlich zu funktionieren. "test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === nullobwohl "test" ein gültiger JS-Variablenname ist
David Murdoch
Nein, ich bin mir ziemlich sicher, dass ich gemeint habe, was ich geschrieben habe :) Die Frage, wie ich verstanden habe, hat nur gefragt, was ein gültiger Javascript-Funktionsname ist, nicht wie ein regulärer Ausdruck dafür in speziell Javascript wäre. Ich habe es in RegexBuddy gemacht und verwende es in PHP auf der Beispielseite, auf die ich verlinke. Funktioniert super und testwird auch akzeptiert.
Svish
3
@DavidMurdoch Ich habe einen JavaScript-kompatiblen regulären Ausdruck mit 11.335 Zeichen geschrieben, mit dem Bezeichner (auch als Variablennamen bezeichnet) überprüft werden können. Siehe meine Antwort .
Mathias Bynens
3
@Svish Es sollte beachtet werden, dass Ihre Regex einige falsch positive Ergebnisse aufweist. Zusätzliche Unicode-Zeichen (z. B. U + 2F800 CJK-Kompatibilitätsideogramm , das in der Kategorie [Lo] aufgeführt ist) sind in Bezeichnernamen\uD87E\uDC00 nicht zulässig , da JavaScript sie als zwei einzelne Ersatzhälften (z. B. ) interpretiert, die keinem der zulässigen Unicodes entsprechen Kategorien. Ihre Regex würde jedoch einen solchen Charakter zulassen.
Mathias Bynens
2
@Svish Nun ja, durch die Bereiche selbst auszuschreiben, wie ich :) Beachten Sie, dass Ihre Regex auch nicht Konto nicht für die eval, arguments, NaN, Infinityund undefinedGrenzfälle .
Mathias Bynens
6

Javascript-Variablen können Buchstaben, Ziffern, Dollarzeichen ($) und Unterstriche (_) enthalten. Sie können nicht mit Ziffern beginnen.

Normalerweise verwenden Bibliotheken $und _als Verknüpfungen für Funktionen, die Sie überall verwenden werden. Obwohl die Namen $oder _nicht aussagekräftig sind, sind sie für ihre Kürze nützlich und da Sie die Funktion überall dort verwenden, wo Sie wissen sollen, was sie bedeuten.

Wenn Ihre Bibliothek nicht darin besteht, dass eine einzige Funktion überall verwendet wird, würde ich empfehlen, dass Sie aussagekräftigere Namen verwenden, da diese Ihnen und anderen helfen, zu verstehen, was Ihr Code tut, ohne die Quellcode- Schönheit unbedingt zu beeinträchtigen .

Sie können zum Beispiel einen Blick auf die fantastische DateJS- Bibliothek werfen und auf den synthetischen Zucker, den sie zulässt, ohne dass Symbole oder Variablen mit kurzen Namen erforderlich sind.

Sie sollten Ihren Code zuerst praktisch machen und erst, nachdem Sie versucht haben, ihn hübsch zu machen.

Miguel Ventura
quelle
4

Wenn reguläre Ausdrücke kein Muss sind, ist es nicht besser, den Browser zu bitten, sich für die Verwendung zu entscheiden 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
quelle
6
Nein, würde es nicht. xss = alert("I'm in your vars executin mah scrip's");;;;;Zum Beispiel ist kein gültiger Javascript-Variablenname.
1j01
6
xss;alert("try again");
1j01
1
Trotz der Sicherheitsanfälligkeit durch XSS-Angriffe ist dies eine ziemlich clevere Idee.
Zahnbürste
@ 1j01 Wie wäre es mit ersetzen namedurch (typeof name === "string")? name.replace(/\(|\)/,"") : "_noXSS" )? Wenn es sich um eine Zeichenfolge handelt, werden Klammern ersetzt (in Variablen definitiv nicht zulässig). Daher denke ich, dass es nahezu unmöglich wäre, etwas auszuführen.
Royhowie
2
Nun, dann isValidVarName('aler(t')wird es wahr. Und isValidVarName('_;;;')bleibt wahr. Sie können aber zu Beginn prüfen, ob es mit so etwas übereinstimmt, /[;,\(\)]/aber dann können Sie es trotzdem ausführen _=location="#!?", um =es der Liste hinzuzufügen , aber Sie können es weiterhin ausführen '_\ndelete foo'(was den Test als gültigen Variablennamen besteht), sodass Sie \ns und \rs und möglicherweise ausschließen müssen eine Unicode-Newline? Aber `$` ist keine gültige Kennung, daher müssen Sie alle Leerzeichen ausschließen ... Es ist ein verlorener Kampf. Ich denke, das ist so weit ich gegen mich selbst gehen kannif(/[;,\(\)=\s]/.exec(name))return!1
1j01
1

Hier ist ein kurzer Vorschlag zum Erstellen von Variablennamen. Wenn Sie möchten, dass die Variable bei der Verwendung in FireFox nicht in Konflikt gerät, verwenden Sie nicht den Variablennamen " _content ", da dieser Variablenname bereits vom Browser verwendet wird. Ich habe das auf die harte Tour herausgefunden und musste alle Stellen ändern, an denen ich die Variable "_content" in einer großen JavaScript-Anwendung verwendet habe.

DanBrianWhite
quelle
Können Sie dies mit einem fehlgeschlagenen Quellcode beweisen? In Firefox scheint es nichts zu tun.
Zahnbürste
Hier ist eine jsfiddle, die warnt, wenn die Variable "_content" nicht "undefiniert" ist und wenn "_content" von FireFox festgelegt wird, wird sie auf "window.content" gesetzt. Jsfiddle.net/R2qvt/3
DanBrianWhite
1

Ich habe Anas Nakawas Idee aufgegriffen und verbessert. Erstens gibt es keinen Grund, die deklarierte Funktion tatsächlich auszuführen. Wir möchten wissen, ob es korrekt analysiert wird und nicht, ob der Code funktioniert. Zweitens ist ein wörtliches Objekt ein besserer Kontext für unseren Zweck, als var XXXda es schwieriger ist, aus ihm auszubrechen.

    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
quelle
1
Versuche es nicht einmal. isValidVarName('}; }); alert("I\'m in your vars executin\' mah scripts"); true; // yeah, super valid');
1j01
1
@ 1j01, Agh, ich habe den Codekommentar vergessen. Ich hatte gehofft, dass allein durch das Ungleichgewicht der Klammern der Code nicht ausgeführt werden kann. Eine einfache Überprüfung auf }sollte dies ausschließen.
Cleong
isValidVarName("delete") === true
1j01
1

Schrieb einen Glitch-Arbeitsbereich , der alle Codepunkte durchläuft und das Zeichen ausgibt, wenn es eval('var ' + String.fromCodePoint(#) + ' = 1')funktioniert.

Es geht einfach weiter und weiter und weiter ...

Allain Lalonde
quelle