JavaScript 변수 이름에 유효한 문자는 무엇입니까?


557

JavaScript 변수의 이름을 지정하는 데 사용할 수있는 문자는 무엇입니까?

나는 직장에서 자바 스크립트를 사용하지 않는 사용자를 위해 작은 "확장 라이브러리"를 만들고 싶다. (언어에 관해서는 모두 겁나는 것처럼 보인다) jQuery와 Prototype이 $달러 기호를 어떻게 사용하는지 좋아하고 jQuery를 사용하기 때문에 사용할 또 다른 멋진 단일 문자 기호를 찾고 있습니다.

나는 여러 문자를 테스트 할 수 있다는 것을 알고 있지만 (나중에 인기있는 다른 라이브러리와의 통합을 고려하여) 시작할 문자 목록을 좁히기를 바라고 있습니다.


44
아니. 유니 코드 문자가 허용됩니다. 예를 들어 π를 사용해보십시오.
nalply

14
변수 이름에 유니 코드 문자를 사용할 수 있지만 코드에 유니 코드를 사용하면 문제가 발생할 수 있습니다 . 변수없이 사용할 수 있다면 변수 이름에 사용하지 않는 것이 좋습니다.
게리 S. 위버

F #은 유효한 변수 이름입니까? 작은 기능의 자바 스크립트 라이브러리를 작성 중이며 모듈 이름으로 F #을 사용하고 싶습니다. 일반적인 함수 호출은 다음과 같습니다. F # .partial (fn, ... presetArgs);
Jules Manson

파운드 기호는 다른 용도로 예약되어 있기 때문에 @JulesManson 아니요.
Aidan Lovelace 2016 년

@JulesManson 그런데 F #이라는 이름은 이미 Microsoft에서 .NET에서 가져 왔습니다.
Luke the Geek

답변:


986

유효한 JavaScript 변수 이름 을 인용 하기 위해 관련 스펙 섹션을 요약하여 작성했습니다.

식별자로 시작해야합니다 $, _또는 유니 코드 범주에있는 모든 문자 "대문자 (루)" , "소문자 (LL)" , "타이틀 케이스 문자 (중위)" , "수정 편지 (LM)" , "다른 편지 ( Lo) ' 또는 'Letter number (Nl) ' .

문자열의 나머지 부분에는 동일한 문자와 U + 200C의 너비가없는 0이 아닌 문자, U + 200D 제로 너비 조인 문자 및 유니 코드 범주 "Non-spacing mark (Mn)" , "Spacing combination 표시 (Mc)” , “소수 자릿수 (Nd)” 또는 “커넥터 구두점 (Pc)” .

또한 입력 한 문자열이 ECMAScript 5.1 및 Unicode 6.1에 따라 유효한 JavaScript 변수 이름인지 알려주 는 도구 를 만들었습니다 .

자바 스크립트 변수 이름 검사기


PS로 당신에게 앤서니 밀스 '대답이 얼마나 잘못의 아이디어를 줄 : 자바 스크립트에 대해 하나의 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

2
젠장 그래서 난 똑똑하지 못하고 ¢보완하기 위해 사용 $... 오 잘 ...)-:
hippietrail

3
사실입니다 (그리고 멋진 답변). 그러나 이것이 옳은 것은 아닙니다 : 유사하지만 사실과 다른 문자를 사용하여 코드를 난독 화하거나 유니 코드가 아닌 환경에서 사용할 수없는 문자를 사용하여 코드를 난독 화하는 것은 잘못된 것입니다. 코딩에는 도움이되지 않으며 대신 수많은 버그를 생성 할 수 있습니다. 유일하게 좋은 장점은 : 일부 코드가 유니 코드를 사용하고 (유니 코드와 다른 표현을 고통스럽게 인식한다는) 사람들 (통증)을 인식하게 할 것입니다 ... 유니 코드 정보 : 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. 유니 코드 문자는 다음 범주의 모든 문자입니다 ( 모든 범주 참조 ).

  • 대문자 (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

73

기본적으로 정규 표현식 형식 : [a-zA-Z_$][0-9a-zA-Z_$]*. 즉, 첫 번째 문자는 문자 또는 _ 또는 $ 일 수 있고 다른 문자는 문자 또는 _ 또는 $ 또는 숫자 일 수 있습니다.

참고 : 다른 답변에 따르면 JavaScript 식별자에서 유니 코드 문자를 사용할 수 있다고 지적했지만 실제 질문은 "jQuery와 같은 확장 라이브러리의 이름에 어떤 문자를 사용해야합니까?"였습니다. 이것은 그 질문에 대한 답변입니다. 식별자에는 유니 코드 문자를 사용할 수 있지만 사용하지 마십시오. 인코딩은 항상 망가집니다. 공개 식별자는 32-126 ASCII 범위 내에서 안전한 곳에 보관하십시오.


71
레이블 이름에 유니 코드 문자를 사용한 공동 개발자를 암살하려 할 것입니다. / 거의 아이러니 연설
에릭 Reppen

12
롬 킨스, 나는 "유니 코드 문자 식별자 이름"이 "자바 스크립트 : 좋은 부분"에 포함될 것이라고 생각하지 않기 때문에 그것들의 존재를 무시하는 것을 선호한다. 그러나 귀하의 이익을 위해 답변에 면책 조항을 추가했습니다.
Anthony Mills

11
인코딩에 대해서 : 제발 당신의 문자열 리터럴 적어도, 사용 비 ASCII 문자를. 우리는 인코딩을 "항상 망쳐 놓은"모든 바보 같은 소프트웨어를 제거해야합니다. Console.WriteLine("привет")C #을 입력 하고 실제로 작동시키는 것이 얼마나 행복합니까 !
Roman Starkov

14
@Timwi, 특히 Richard가 말한 것처럼 라이브러리를 작성할 때 사용자를 Alt-blah 쓰레기 또는 복사하여 붙여 넣기를 강요하지 않는 것이 좋습니다. 또한 자신의 물건에 대해 브라우저 또는 프록시 서버 버그 또는 기타 문제가 발생할 때 발생하는 성가심을 처리하는 것이 좋을 수도 있지만 라이브러리 사용자가 그 물건을 다루는 것은 멋지지 않습니다. 좋은 대답은 당면한 문제를 다루는 것보다 "무엇을해야합니까?"라고 대답합니다. 예, 사람들을 돕고 싶습니다. "오, 이러지마"라고 말하지 않으면 쓸모없고 위험한 정보는 포함시키지 않을 것입니다.
Anthony Mills

37
@Tchalvak 방금 사용하는 코드의 경우 기본 라이브러리 이름으로 Ʒ를 사용하는 것이 좋습니다. (오, 당신은 그것이 3이라고 생각했습니다. 죄송합니다. 실제로 U + 01B7 라틴 대문자 Ezh입니다! 아니면 З, 키릴 대문자 대문자 Ze입니까?) 다른 사람들이 사용할 수있는 라이브러리를 작성하려고한다면 그러나 ASCII를 따르는 것이 가장 좋습니다.
Anthony Mills

18

자바 스크립트 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}]*$

이것은 영어로 표현하기가 더 어렵지만 문자와 숫자가 모든 언어에서 나올 수 있다는 점을 제외하면 개념이 이전 구문과 비슷합니다. 첫 번째 문자 다음에는 밑줄과 같은 추가 문자 (통칭하여 "커넥터"라고 함) 및 추가 문자 결합 표시 ( "수정 자")가 허용됩니다. 다른 통화 기호는이 확장 세트에 포함되지 않습니다.

자바 스크립트 1.5은 나중에 또 유니 코드 이스케이프 시퀀스가 허용 것을 제공하는 결과가 정규 표현식 위의 허용 될 캐릭터입니다.

식별자는 현재 예약어이거나 향후 사용을 위해 고려되는 단어가 아니어야합니다.

식별자의 길이에는 실질적인 제한이 없습니다. (브라우저는 다양하지만 1000 자 이상이며 그보다 몇 자릿수가 더 높습니다.)

캐릭터 카테고리에 연결 :

  • 문자 : Lu , Ll , Lt , Lm , Lo , Nl
    (위의 정규식에서 "L"로 결합 됨)
  • 결합 마크 ( "수정 제") : Mn , Mc
  • 숫자 : Nd
  • 커넥터 : PC

* nb 이 Perl 정규식은 구문 만 설명하기위한 것입니다. JavaScript에서는 작동하지 않으며 유니 코드 속성에 대한 지원은 포함되지 않습니다. 이러한 지원을 추가한다고 주장하는 타사 패키지가 있습니다.


이 정규식이 실제로 작동하지 않는 것 같습니다. "test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === null비록 "테스트"유효한 JS 변수의 이름입니다
데이비드 머독

죄송하지만 JavaScript는이 정규식을 지원하지 않습니다. 명확히하기 위해 메모를 추가했습니다.
danorton

5
두 번째 정규 표현식에는 잘못된 긍정이 있습니다. 보조 유니 코드 문자 (예 : [Lo] 범주에 나열된 U + 2F800 CJK 호환성 Ideograph )는 식별자 이름에서 허용되지 않습니다. JavaScript \uD87E\uDC00는 허용 된 유니 코드와 일치하지 않는 두 개의 개별 대리 반으로 해석됩니다 (예 :). 카테고리. 그러나 정규 표현식은 그러한 문자를 허용합니다. 또한 U + 200C 및 U + 200D가 없습니다.
Mathias Bynens

1
ES6는이 목적을 위해 명시 적으로 의도 된 문자 클래스를 사용하여 유효한 식별자를 공식적으로 정의합니다 (이전에 사실인지 확실하지 않음)-예약어를 고려하지 않으면이 정규식을 좀 더 읽기 쉽게 만들 수 있습니다. 적어도 유니 코드 이스케이프 시퀀스가 ​​이제 식별자에서도 유효하다는 사실이 아니었다면! 이것은 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] + \})) *
세미콜론

14

실제로 ECMAScript는 15 페이지에 다음과 같이 말합니다. 식별자는 $, 밑줄 또는 UnicodeLetter로 시작할 수 있으며 유니 코드 문자는 유니 코드 범주 Lo, Ll의 모든 문자가 될 수 있음을 지정하기 위해 계속 진행됩니다 (그 바로 아래) , Lu, Lt, Lm 및 Nl. 그리고 당신이 그 범주를 찾아 보면 이것이 라틴 문자보다 더 많은 가능성을 열어 준다는 것을 알게 될 것입니다. Google에서 "unicode catagories"를 검색하면 찾을 수 있습니다.


연결 오류 및 404 모두 ( "유니 코드 범주")를 인터넷 검색 할 때 모든 관련 결과에 대해 얻습니다 ... :(
Calmarius

13

자바 스크립트 변수

문자 $, 또는 _문자 로 변수를 시작할 수 있습니다 . 숫자로 시작하지 않는 한 숫자도 포함 할 수 있습니다.

스타트: [a-z], $, _

있다: [a-z], [0-9], $, _

jQuery

_라이브러리에서 jQuery와 나란히 사용할 수 있습니다 . 그러나 jQuery가 사용하지 않도록 설정할 수있는 구성이 있습니다 $. 대신을 사용 jQuery합니다. 이를 위해서는 간단히 다음을 설정하십시오.

jQuery.noConflict();

이 페이지 를 수행하는 방법을 설명합니다.


이것은 절대적으로 맞지만, 나는 당신에게 .02123413124 밀리 초 전에 대답 한 Anthony에게 답을 주었다. 죄송합니다.
리처드 클레이튼

8
@Richard : 아니요, 절대적으로 정확하지 않습니다. @ Yuvalik 및 @ Anurag의 답변을 참조하십시오.
팀 다운

@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, 디버거, 함수, 이것, with, default, if, throw, delete, in, try, class, enum, extends, super, const, export, import, 구현, let, private, public, yield, 인터페이스, 패키지, 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 변수의 이름입니다
데이비드 머독

아니, 나는 내가 쓴 것을 의미한다고 확신한다. : 내가 이해했던 것처럼, 질문은 유효한 자바 스크립트 함수 이름이 무엇인지를 물었다. RegexBuddy에서 만들었고 링크 된 샘플 페이지에서 PHP로 사용하고 있습니다. 잘 작동하고 test또한 받아 들여집니다.
Svish

3
@DavidMurdoch 나는 식별자 (일명 변수 이름)의 유효성을 검사하는 데 사용할 수있는 11,335 자의 JavaScript 호환 정규 표현식을 작성했습니다. 내 답변을 참조하십시오 .
Mathias Bynens

3
@Svish 정규 표현식에 잘못된 긍정이 있다는 점에 유의해야합니다. 보조 유니 코드 문자 (예 : [Lo] 범주에 나열된 U + 2F800 CJK 호환성 Ideograph )는 식별자 이름에서 허용되지 않습니다. JavaScript \uD87E\uDC00는 허용 된 유니 코드와 일치하지 않는 두 개의 개별 대리 반으로 해석됩니다 (예 :). 카테고리. 그러나 정규 표현식은 그러한 문자를 허용합니다.
Mathias Bynens

2
그래 그럼 @Svish, 내가했던 것처럼, 자신을 범위를 작성 : 참고하여 정규식도 고려하지 않습니다에 의해 , , , 가장자리의 경우 . evalargumentsNaNInfinityundefined
Mathias Bynens

6

자바 스크립트 변수는 문자, 숫자, 달러 기호 ($) 및 밑줄 (_)을 가질 수 있습니다. 숫자로 시작할 수 없습니다.

보통 도서관은 $_기능에 대한 단축키 당신은 모든 곳에서 사용하게 될 것이있다. 비록 이름 $이나_ 의미가없는, 그들은 자신의 곤란과 당신이 그들이 무슨 뜻인지 알아 것으로 예상하고 사방이 기능을 사용하는 것이기 때문에 유용하다.

라이브러리가 모든 곳에서 단일 함수를 사용하도록 구성되어 있지 않은 경우 소스 코드의 훌륭함을 손상시키지 않고 코드가 수행중인 작업을 이해하는 데 도움이되므로 더 의미있는 이름을 사용하는 것이 좋습니다. .

예를 들어 멋진 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");;;;;예를 들어 유효한 자바 스크립트 변수 이름이 아닙니다.
1j01

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

1
XSS 공격 취약점에도 불구하고 상당히 영리한 아이디어입니다.
칫솔

@ 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에서는 아무것도하지 않는 것 같습니다.
칫솔

다음은 변수 "_content"가 "undefined"가 아니고 Fire_ox에 의해 "_content"가 설정된 경우 경고하는 jsfiddle입니다. "window.content"로 설정되어 있습니다. jsfiddle.net/R2qvt/3
DanBrianWhite

1

Anas Nakawa의 아이디어를 취해 개선했습니다. 우선, 선언되는 함수를 실제로 실행할 이유가 없습니다. 코드가 작동하는지 여부가 아니라 올바르게 구문 분석되는지 여부를 알고 싶습니다. 둘째, 리터럴 객체는 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

1
@ 1j01, 아, 코드 주석에 대해 잊어 버렸습니다. 대괄호의 균형을 맞추지 않아도 코드가 실행되지 않기를 바랐습니다. 간단한 점검 }만으로는 불가능합니다.
cleong

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.