JavaScript変数名に有効な文字は何ですか?


557

JavaScript変数の命名に使用できる文字はどれですか?

ここで仕事をしているJavaScriptを使用しないユーザー向けの小さな「拡張ライブラリ」を作成したいと考えています(言語に関してはすべてが不快に思えます)。jQueryとPrototypeの両方で$ドル記号を使用する方法が大好きです。jQueryを使用しているので、使用するもう1つの優れた1文字の記号を探しています。

私はいくつかの文字をテストできることを理解していますが、最初に文字のリストを絞り込むことを望んでいます(おそらく別の人気のあるライブラリとの将来の統合を考慮して)。


44
番号。Unicode文字を使用できます。たとえば、πを試してください。
nalply

14
変数名ではUnicode文字を使用できますが、コードでUnicodeを使用すると問題が発生する可能性があります。それらがなくても問題がなければ、変数名に使用しないことをお勧めします。
ゲーリーS.ウィーバー

F#は有効な変数名ですか?小さな関数型JavaScriptライブラリを構築しています。モジュール名にF#を使用したいと思います。典型的な関数呼び出しは次のようになります。F#.partial(fn、... presetArgs);
Jules Manson、

@JulesMansonいいえ。ポンド記号は他の用途のために予約されているためです。
Aidan Lovelace

@JulesMansonちなみに、F#という名前は既に.NETからMicrosoftが採用しています
Luke the Geek

回答:


986

有効なJavaScript変数名を引用するために、関連する仕様セクションを要約した私の記述:

識別子が始まらなければなりません$_またはUnicodeのカテゴリ内の任意の文字「大文字(LU)」「小文字の手紙(LL)」「タイトル文字の手紙(LT)」「修飾文字(LM)」「その他の文字( Lo)」、または「文字番号(Nl)」

文字列の残りの部分には、同じ文字に加えて、任意のU + 200Cゼロ幅の非結合文字、U + 200Dゼロ幅の結合文字、およびUnicodeカテゴリ「非間隔マーク(Mn)」「間隔の組み合わせ」の文字を含めることができます。マーク(Mc)」「10進数(Nd)」、または「コネクタの句読点(Pc)」

また入力した文字列がECMAScript 5.1およびUnicode 6.1に従って有効なJavaScript変数名であるかどうかを通知するツールも作成しまし

JavaScript変数名バリデーター


PS Anthony Millsの答えがどれほど間違っているかを理解するために:これらのルールをすべて、JavaScriptの単一のASCIIのみの正規表現で要約すると、11,236文字になります。ここにあります:

// 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
これを生成するのにかかった時間について、クレジットを差し上げます。
Richard Clayton、

18
@marsbear私もたまたまそれについての記事を書いたことがあります:mathiasbynens.be/notes/javascript-propertiesそしてツールも:mothereff.in/js-properties#12e34私関連するスタックオーバーフローの答えは次のとおりです。
Mathias Bynens、2012年

2
私は賢くなり¢、補完するために使用することができないので、$)-:
くそったれ

3
それは本当です(そして素晴らしい答えです)。ただし、これは正しくはありません。似たような見た目をしているが実際には異なる文字を使用して(または非Unicode環境では使用できない文字を使用して)コードを難読化するのは間違っています。コーディングの助けにはならず、代わりに多数のバグを作成する可能性があります。唯一の良い面:一部のコードがUnicodeを使用している可能性を(痛みを伴って)人々に知らせます(そしてUnicodeとそのさまざまな表現を痛々しく認識します)...ユニコードについて:joelonsoftware.com/articles/Unicode.html
Olivier Dulac

4
@ n2liquid-GuilhermeVieiraすべてのJavaScriptエンジンが100%仕様に準拠していると仮定した場合に限りますが、常にそうであるとは限りません。私がこの調査を行ったのは確かではありませんでした。私がリンクしたブログの投稿は、私が提出してパッチを適用したすべてのブラウザー/エンジンのバグについて言及しています。
Mathias Bynens、2014年

117

セクション7.6識別子名と識別子のECMAScript仕様から、有効な識別子は次のように定義されます。

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

これにより、変数に名前を付けたり、ゴルフをしたりする機会がたくさん生まれます。いくつかの例を試してみましょう。

有効な識別子のいずれかで開始することができUnicodeLetter$_、または\ UnicodeEscapeSequence。Unicode文字は、次のカテゴリのすべての文字です(すべてのカテゴリを参照)。

  • 大文字(Lu)
  • 小文字(Ll)
  • タイトルケース文字(Lt)
  • 修飾文字(Lm)
  • その他の手紙(Lo)
  • 文字番号(Nl)

これだけでも、いくつかのクレイジーな可能性を説明しています。すべてのブラウザで機能しない場合は、バグと呼んでください。

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

1
JavaScriptの例が現在欠けているこのRosettaコードページに例の行をコピーしていただけませんか?
Walter Tross 2014年

73

基本的に、正規表現形式で:[a-zA-Z_$][0-9a-zA-Z_$]*。つまり、最初の文字は文字または_または$で、その他の文字は文字または_または$または数字です。

注:他の回答ではJavaScript識別子にUnicode文字を使用できると指摘されていますが、実際の質問は「jQueryのような拡張ライブラリの名前にはどの文字を使用すればよいですか?」これがその質問への答えです。識別子にはUnicode文字を使用できますが、使用しないでください。エンコーディングは常に失敗します。安全な場所で、公開識別子を32〜126 ASCIIの範囲に保ちます。


71
おそらく、ラベル名にユニコード文字を使用した共同開発者を暗殺する計画を立てるでしょう。/かろうじて皮肉なスピーチ
エリック・レッペン、2011

12
romkyns、「Unicode文字の識別子名」が「JavaScript:The Good Parts」に含まれることはないと思うので、その存在を無視することを好みます。しかし、私はあなたの利益のために私の答えに免責事項を追加しました。
アンソニーミルズ

11
エンコーディングについて:してください行い、少なくとも、あなたの文字列リテラルでは、使用した非ASCII文字が。私たちは、エンコーディングを「常にねじ込んで」しまう愚かなソフトウェアをすべて排除しなければなりません。Console.WriteLine("привет")C#に入力して実際に機能させるのは至福です。
ロマン・スターコフ2012年

14
@Timwiを見て、特にライブラリを書いているとき(Richardが書いているように)、ユーザーにAlt-blahがらくたやコピーアンドペーストを強制しないのは親切です。また、あなた自身のものについては、ブラウザやプロキシサーバーのバグなどに遭遇したときに発生する煩わしさを処理することに問題がないかもしれませんが、ライブラリのユーザーにそのようなものを処理させることはクールではありません。良い答えは、目の前の質問に対処するだけではなく、「どうすればよいか」を答えます。だから、はい、私は人々を助けたいです。「ああ、そうしないでください」と言わない限り、役に立たない危険な情報は含めません。
アンソニーミルズ

37
@Tchalvakあなただけが使用しているコードの場合、メインライブラリ名としてusingを使用することはおそらく問題ありません。(ああ、それは3だと思ったのですか。すみません、実際にはU + 01B7ラテン大文字Ezhです。それともЗ、キリル文字大文字Zeでしたか?)他の人が使用する可能性のあるライブラリを作成する場合ただし、ASCIIを使用することをお勧めします。
アンソニーミルズ

18

JavaScript 1.5より前: ^[a-zA-Z_$][0-9a-zA-Z_$]*$

英語:ドル記号、アンダースコア、または26文字のアルファベットの大文字または小文字のいずれかで始まる必要があります。後続の文字(存在する場合)は、それらのいずれかまたは10進数です。

JavaScript 1.5以降*^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$

これは英語で表現するのはより困難ですが、概念的には古い構文に似ていますが、文字と数字は任意の言語からのものである可能性があります。最初の文字の後には、追加のアンダースコアのような文字(まとめて「コネクター」と呼ばれます)と追加の文字結合マーク(「修飾子」)も許可されます。(他の通貨記号は、この拡張セットには含まれていません。)

JavaScript 1.5以降は、結果が上記の正規表現で許可される文字であれば、Unicodeエスケープシーケンスも許可されます。

また、識別子は現在の予約語や将来の使用を考慮したものであってはなりません。

識別子の長さに実際的な制限はありません。(ブラウザーはさまざまですが、1000文字、おそらくそれよりも数桁多くなるはずです。)

キャラクターカテゴリーへのリンク:

  • 文字:LuLlLtLmLoNl
    (上記の正規表現で「L」として結合)
  • 結合マーク(「修飾語」):MnMc
  • 桁:Nd
  • コネクタ:Pc

* nb このPerl正規表現は構文のみを説明することを目的としています— JavaScriptでは機能しません。これは(まだ)Unicodeプロパティのサポートを含みません。(そのようなサポートを追加すると主張するいくつかのサードパーティのパッケージがあります。)


この正規表現を実際に機能させることができないようです。"test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === null「テスト」は有効なJSの変数名であっても
デヴィッド・マードック

JavaScriptはこの正規表現をサポートしていません。明確にするためにメモを追加しました。
danorton 2012

5
2番目の正規表現にはいくつかの誤検知があることに注意してください。補足的なUnicode文字(たとえば、[Lo]カテゴリにリストされているU + 2F800 CJ​​K互換性Ideograph)は、JavaScript が許可されたUnicodeのいずれにも一致しない2つの個別のサロゲート半分(たとえば)として解釈するため、識別子名では使用でき\uD87E\uDC00ません。カテゴリ。しかし、あなたの正規表現は、そのような文字を許可します。また、U + 200CおよびU + 200Dがありません。
Mathias Bynens 2012年

1
ES6は、この目的のために明確に意図された文字クラスを使用して有効な識別子を正式に定義します(プログラミングで使用)-これが以前に当てはまったかどうか不明-予約語を考慮しなければ、この正規表現を少し読みやすくすることができます-または少なくとも、Unicodeエスケープシーケンスが識別子でも有効であるという事実がなかったとしたら、そうでしょう。これは、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] + \}))*
セミコロン2015

14

実際、ECMAScriptは15ページで次のように述べています。識別子は$、アンダースコア、UnicodeLetterで始まり、UnicodeLetterがUnicodeカテゴリの任意の文字、Lo、Llである可能性があることを指定します(そのすぐ下)。 、Lu、Lt、Lm、Nl。そして、それらの分類を調べると、これは単にラテン文字よりもはるかに多くの可能性を開くことがわかります。グーグルで「Unicode Catagories」を検索するだけで、それらを見つけることができます。


(「ユニコードカテゴリ」)をグーグル検索すると、関連するすべての結果に対して接続エラーと404がすべて表示されます... :(
Calmarius

13

JavaScript変数

変数は、任意の文字、、$または文字で始めることができます_。数字で始まらない限り、数字も含めることができます。

開始: [a-z], $, _

含む: [a-z], [0-9], $, _

jQuery

_ライブラリをjQueryと並べて使用できるように使用できます。ただし、jQueryがを使用しないように設定できる構成があります$。代わりにを使用しますjQuery。これを行うには、次のように設定します。

jQuery.noConflict();

このページでは、これを行う方法について説明します。


これは完全に正しいですが、あなたの前に.02123413124ミリ秒と答えたアンソニーに答えました。ごめんなさい。
Richard Clayton、

8
@リチャード:いいえ、それは完全に正しいわけではありません。@Yuvalikと@Anuragの回答を参照してください。
Tim Down

@EndangeredMassa変数 "_name"を使用する理由 なぜ名前だけではないのですか?
Tomasz Waszczyk

9

認められた答えは、私が見る限り、多くの有効な識別子を除外します。以下は、私がまとめた正規表現で、仕様に準拠している必要があります(識別子については7.6章を参照)。RegexBuddyを使用して作成しました。説明のエクスポートはhttp://samples.geekality.net/js-identifiersにあります。

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

また、名前を次の予約語にすることはできません。

break、do、instanceof、typeof、case、else、new、var、catch、finally、return、void、continue、for、switch、while、デバッガ、関数、this、with、default、if、throw、delete、in、 try、class、enum、extends、super、const、export、import、implements、let、private、public、yield、interface、package、protected、static、null、true、false


この正規表現は有効なJS正規表現ではありません。私はあなたが意味したと思います:^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\u200C\u200D]*$。今は修正しても、この正規表現を実際に機能させることができないようです。"test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === null「テスト」は有効なJSの変数名であっても
デヴィッド・マードック

いいえ、私が書いたものを意味していると確信しています:)質問は、私が理解しているように、有効なJavaScript関数名とは何かを尋ねたものであり、具体的にはJavaScriptでの正規表現ではありません。RegexBuddyで作成し、リンク先のサンプルページのPHPで使用しています。testうまく機能し、受け入れられます。
Svish

3
@DavidMurdoch識別子(別名、変数名)の検証に使用できる11,335文字のJavaScript互換の正規表現を記述しました。私の答えをください。
Mathias Bynens、2012

3
@Svish正規表現にはいくつかの誤検知があることに注意してください。補足的なUnicode文字(たとえば、[Lo]カテゴリにリストされているU + 2F800 CJ​​K互換性Ideograph)は、JavaScript が許可されたUnicodeのいずれにも一致しない2つの個別のサロゲート半分(たとえば)として解釈するため、識別子名では使用でき\uD87E\uDC00ません。カテゴリ。しかし、あなたの正規表現は、そのような文字を許可します。
Mathias Bynens、2012年

2
うんまあ@Svish、私が行ったように、自分で範囲を書き出す:)注意をあなたの正規表現も考慮しないことによっておよびエッジケースevalargumentsNaNInfinityundefined
Mathias Bynens、2012年

6

JavaScript変数には、文字、数字、ドル記号($)、および下線(_)を含めることができます。数字で始めることはできません。

通常、ライブラリはを使用し$_どこでも使用する関数のショートカットとして使用します。名前が$または_意味がありません、彼らは彼らの短さのために、あなたは彼らが何を意味するか知っていると期待しているどこに機能を使うことになるので、便利です。

ライブラリがすべての場所で使用される単一の関数を取得することに依存していない場合、ソースコードの素晴らしさを損なうことなく、コードが何をしているかを他の人が理解するのに役立つので、より意味のある名前を使用することをお勧めします。

たとえば、すばらしいDateJSライブラリと、記号短い名前の変数を必要とせずに許可される構文糖を見てみましょう。

あなたは最初にコードを実用的にするべきです、そしてそれをきれいにしてみて初めて。


4

正規表現が必須ではない場合、ブラウザに使用を決定するよう依頼するだけの方がいいのではないでしょう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
いいえ、そうではありません。xss = alert("I'm in your vars executin mah scrip's");;;;;たとえば、有効なJavaScript変数名ではありません。
1j01

6
xss;alert("try again");
1j01

1
XSS攻撃の脆弱性にもかかわらず、これはかなり賢いアイデアです。
歯ブラシ2014

@ 1j01で置き換えnameてみ(typeof name === "string")? name.replace(/\(|\)/,"") : "_noXSS" )ませんか?文字列の場合、括弧は置き換えられます(変数では絶対に使用できません)。したがって、何も実行することはほぼ不可能だと思います。
royhowie

2
さて、それからisValidVarName('aler(t')本当になります。そしてisValidVarName('_;;;')本当のまま。しかし、それが次のようなものと一致するかどうかを最初に確認することはできます/[;,\(\)]/が、実行は可能である_=location="#!?"ため=、リストに追加できますが、実行は可能です'_\ndelete foo'(テストを有効な変数名として渡します)。したがって、\nsと\rs を除外する必要があります。いくつかのユニコード改行?しかし、 `$`は有効な識別子ではないため、すべての空白を除外する必要があります...これは敗北の戦いです。私はそれは私が自分自身に対して行くことができる限りだと思うif(/[;,\(\)=\s]/.exec(name))return!1
1j01

1

変数名を作成するための簡単な提案を次に示します。変数がFireFoxで使用されているときに競合しないようにする場合は、変数名「_content」を使用しないください。この変数名はすでにブラウザで使用されているためです。私はこれを難しい方法で見つけ、大きなJavaScriptアプリケーションで変数 "_content"を使用したすべての場所を変更する必要がありました。


失敗するいくつかのソースコードでこれを証明できますか?Firefoxでは何もしないようです。
歯ブラシ2014

変数 "_content"が "未定義"ではなく、FireFoxによって "_content"が設定されている場合、 "window.content"に設定されると警告するjsfiddleは次のとおりです。jsfiddle.net
R2qvt

1

名川アナスのアイデアを取り入れて改良しました。まず、宣言されている関数を実際に実行する理由はありません。コードが機能するかどうかではなく、正しく解析されるかどうかを知りたいのです。第二に、文字通りのオブジェクトは、var XXX抜け出すのが難しいよりも、私たちの目的にとってより良いコンテキストです。

    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
しようとしないでください。isValidVarName('}; }); alert("I\'m in your vars executin\' mah scripts"); true; // yeah, super valid');
1j01 2015

1
@ 1j01、ああ、私はコードコメントを忘れていました。ブラケットのアンバランスだけでコードが実行されないようにしたいと思っていました。の簡単なチェックはそれ}を排除するはずです。
cleong 2015

isValidVarName("delete") === true
1j01 2015

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.