Những ký tự nào là hợp lệ cho tên biến JavaScript?


557

Những ký tự nào có thể được sử dụng để đặt tên một biến JavaScript?

Tôi muốn tạo một "thư viện mở rộng" nhỏ cho những người dùng không phải là JavaScript của tôi tại nơi làm việc (tất cả những người dường như bị lúng túng khi nói đến ngôn ngữ này). Tôi thích cách cả jQuery và Prototype đều sử dụng $ký hiệu đô la và vì tôi sử dụng jQuery, tôi đang tìm một biểu tượng ký tự đơn đẹp khác để sử dụng.

Tôi nhận ra rằng tôi chỉ có thể thử nghiệm một số nhân vật, nhưng tôi hy vọng sẽ thu hẹp danh sách các nhân vật của mình để bắt đầu (có thể xem xét việc tích hợp trong tương lai với một thư viện phổ biến khác, có lẽ).


44
KHÔNG. Chữ Unicode được chấp nhận. Hãy thử ví dụ.
nalply

14
Mặc dù các chữ cái unicode được chấp nhận trong các tên biến, sử dụng unicode trong mã có thể có vấn đề . Tôi sẽ đề nghị không sử dụng chúng trong tên biến nếu bạn có thể nhận được mà không có chúng.
Gary S. Weaver

F # có phải là tên biến hợp lệ không? Tôi đang xây dựng một thư viện javascript chức năng nhỏ và tôi muốn sử dụng F # cho tên mô-đun của nó. Một lệnh gọi hàm thông thường sẽ trông như thế này: F # .partial (fn, ... presetArss);
Jules Manson

@JulesManson Không, vì biểu tượng bảng Anh được dành riêng cho các mục đích sử dụng khác.
Aidan Lovelace

@JulesManson Nhân tiện, cái tên F # đã được Microsoft lấy từ .NET
Luke the Geek

Câu trả lời:


986

Để trích dẫn tên biến JavaScript hợp lệ , bài viết của tôi tóm tắt các phần đặc tả có liên quan:

Một định danh phải bắt đầu với $, _hoặc bất kỳ ký tự trong các danh mục Unicode “viết hoa chữ cái (Lu)” , “Chữ thường chữ cái (LL)” , “Titlecase chữ cái (Lt)” , “Modifier chữ cái (Lm)” , “lá thư khác ( Lo) , hay Số thư (Nl) .

Phần còn lại của chuỗi có thể chứa các ký tự tương tự, cộng với bất kỳ U + 200C zero chiều rộng không joiner ký tự, U + 200D zero joiner chiều rộng ký tự, và các nhân vật trong các danh mục Unicode “Non-khoảng cách đánh dấu (Mn)” , “Spacing kết hợp mark (Mc) Đây , số thập phân số thập phân (Nd) , hoặc dấu chấm nối (Pc) .

Tôi cũng đã tạo một công cụ sẽ cho bạn biết nếu bất kỳ chuỗi nào bạn nhập là tên biến JavaScript hợp lệ theo ECMAScript 5.1 và Unicode 6.1:

Trình xác thực tên biến JavaScript


PS Để cho bạn biết câu trả lời của Anthony Mills sai như thế nào: nếu bạn tóm tắt tất cả các quy tắc này trong một biểu thức chính quy duy nhất ASCII cho JavaScript, thì nó sẽ dài 11.236 ký tự . Đây là:

// 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
Tôi sẽ cung cấp cho bạn tín dụng cho khoảng thời gian cần thiết để bạn tạo ra điều này.
Richard Clayton

18
@marsbear Tôi cũng đã viết một bài báo về điều đó: mathiasbynens.be/notes/javascript-properies Và một công cụ nữa: Mothereff.in/js-properIES#12e34 Đây là câu trả lời Stack Overflow có liên quan của tôi.
Mathias Bynens

2
Chết tiệt vì vậy tôi không thể thông minh và sử dụng ¢để bổ sung $... ồ ...)-:
hà mã

3
Đó là sự thật (và một câu trả lời tuyệt vời). Tuy nhiên, điều này không làm cho nó đúng: làm xáo trộn mã bằng cách sử dụng các chữ cái trông giống nhau nhưng thực tế khác nhau (hoặc sử dụng các chữ cái mà môi trường không có mã không thể sử dụng) là sai, imo. Nó sẽ không giúp mã hóa và thay vào đó có thể tạo ra nhiều lỗi. Mặt tốt duy nhất: nó sẽ khiến mọi người (đau đớn) nhận ra khả năng đó là một số mã sử dụng Unicode (và nhận thức sâu sắc về Unicode và các cách biểu diễn khác nhau của nó) ... Về unicode: joelonsoftware.com/articles/Unicode.html
Olivier Dulac

4
@ n2l Liquid-GuilhermeVieira Chỉ khi bạn cho rằng tất cả các công cụ JavaScript đều tuân thủ 100%, điều này không phải luôn luôn như vậy - chắc chắn là không phải khi tôi thực hiện nghiên cứu này. Bài đăng trên blog tôi liên kết để đề cập đến tất cả các lỗi trình duyệt / công cụ tôi đã gửi và vá.
Mathias Bynens

117

Từ đặc tả ECMAScript trong phần 7.6 Tên và định danh định danh , một định danh hợp lệ được xác định là:

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

điều này tạo ra rất nhiều cơ hội để đặt tên các biến và cả trong việc chơi gôn. Hãy thử một số ví dụ.

Một định danh hợp lệ có thể bắt đầu bằng UnicodeLetter, $, _, hoặc \ UnicodeEscapeSequence. Một chữ cái unicode là bất kỳ ký tự nào trong các loại này ( xem tất cả các loại ):

  • Chữ viết hoa (Lu)
  • Chữ thường (Ll)
  • Thư Titlecase (Lt)
  • Thư sửa đổi (Lm)
  • Thư khác (Lo)
  • Số thư (Nl)

Điều này một mình chiếm một số khả năng điên rồ - ví dụ làm việc . Nếu nó không hoạt động trong tất cả các trình duyệt, thì hãy gọi nó là một lỗi, vì nó nên.

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

1
Bạn có thể vui lòng sao chép các dòng ví dụ của bạn vào trang Mã Rosetta này , hiện đang thiếu một ví dụ JavaScript không?
Walter Tross

73

Về cơ bản, ở dạng biểu thức chính quy : [a-zA-Z_$][0-9a-zA-Z_$]*. Nói cách khác, ký tự đầu tiên có thể là một chữ cái hoặc _ hoặc $ và các ký tự khác có thể là chữ cái hoặc _ hoặc $ hoặc số.

Lưu ý: Mặc dù các câu trả lời khác đã chỉ ra rằng bạn có thể sử dụng các ký tự Unicode trong mã định danh JavaScript, nhưng câu hỏi thực tế là "Tôi nên sử dụng ký tự nào cho tên của thư viện tiện ích mở rộng như jQuery?" Đây là một câu trả lời cho câu hỏi đó. Bạn có thể sử dụng các ký tự Unicode trong mã định danh, nhưng không làm điều đó. Mã hóa được vặn vít mọi lúc. Giữ số nhận dạng công khai của bạn trong phạm vi 32-126 ASCII ở nơi an toàn.


71
Tôi có lẽ sẽ âm mưu ám sát một nhà đồng phát triển đã sử dụng các ký tự unicode trong tên nhãn của mình. / lời nói mỉa mai
Erik Reppen

12
romkyns, tôi không nghĩ rằng "tên định danh ký tự Unicode" sẽ được bao gồm trong "JavaScript: Các bộ phận tốt" và do đó, tôi thích bỏ qua sự tồn tại của chúng. Tuy nhiên, tôi đã thêm từ chối trách nhiệm vào câu trả lời của tôi vì lợi ích của bạn.
Anthony Mills

11
Về Mã hoá: xin vui lòng làm nhân vật sử dụng phi ASCII, ít nhất là trong xâu của bạn. Chúng ta phải loại bỏ tất cả các phần mềm ngu ngốc nhận được mã hóa "vặn vẹo mọi lúc". Thật là hạnh phúc khi chỉ cần gõ Console.WriteLine("привет")C # và thực sự hoạt động !
Roman Starkov

14
Hãy nhìn xem, @Timwi, đặc biệt là khi bạn viết thư viện (như Richard nói), thật tốt khi không ép buộc người dùng của bạn vào Alt-blah tào lao hoặc sao chép. Ngoài ra, đối với nội dung của riêng bạn, bạn có thể ổn khi xử lý các phiền toái tăng lên khi bạn gặp phải lỗi trình duyệt hoặc máy chủ proxy hoặc bất cứ điều gì, nhưng làm cho người dùng thư viện của bạn đối phó với nội dung đó không hay. Một câu trả lời tốt trả lời "tôi nên làm gì" hơn là chỉ giải quyết câu hỏi trong tầm tay. Vì vậy, có, tôi muốn giúp đỡ mọi người. Tôi sẽ không bao gồm những thông tin vô ích và nguy hiểm, trừ khi tôi nói "ồ, và đừng làm điều này."
Anthony Mills

37
@Tchalvak Đối với mã mà bạn đang sử dụng, điều đó có thể tốt, sử dụng làm tên thư viện chính của bạn. (Ồ, bạn nghĩ đó là số 3 à? Xin lỗi, thực ra đó là U + 01B7 Chữ viết hoa Latin Ezh! Hay là, Cyrillic Capital Letter Ze?) Nếu bạn định viết một thư viện có thể được người khác sử dụng mặc dù vậy, có lẽ tốt nhất là bám vào ASCII.
Anthony Mills

18

Trước JavaScript 1.5: ^[a-zA-Z_$][0-9a-zA-Z_$]*$

Trong tiếng Anh: Nó phải bắt đầu bằng ký hiệu đô la, gạch dưới hoặc một trong các chữ cái trong bảng chữ cái 26 ký tự, chữ hoa hoặc chữ thường. Các ký tự tiếp theo (nếu có) có thể là một trong những ký tự hoặc một chữ số thập phân.

JavaScript 1.5 trở lên * :^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$

Điều này khó diễn đạt bằng tiếng Anh hơn, nhưng về mặt khái niệm tương tự như cú pháp cũ hơn với việc thêm các chữ cái và chữ số có thể từ bất kỳ ngôn ngữ nào. Sau ký tự đầu tiên, cũng được phép bổ sung các ký tự giống như dấu gạch dưới (gọi chung là các trình kết nối của NX) và các ký tự kết hợp các ký tự bổ sung (các bộ sửa đổi bổ trợ). (Các ký hiệu tiền tệ khác không được bao gồm trong bộ mở rộng này.)

JavaScript 1.5 trở lên cũng cho phép các chuỗi thoát Unicode, với điều kiện kết quả là một ký tự sẽ được cho phép trong biểu thức chính quy ở trên.

Mã định danh cũng không được là một từ dành riêng hiện tại hoặc một từ được xem xét để sử dụng trong tương lai.

Không có giới hạn thực tế cho chiều dài của một định danh. (Các trình duyệt khác nhau, nhưng bạn sẽ có 1000 ký tự một cách an toàn và có thể nhiều đơn hàng độ lớn hơn thế.)

Liên kết đến các loại nhân vật:

  • Chữ cái: Lu , Ll , Lt , Lm , Lo , Nl
    (kết hợp trong regex ở trên với tên LÊ LÊ )
  • Kết hợp các nhãn hiệu (bộ sửa đổi của người dùng): Mn , Mc
  • Chữ số: Nd
  • Kết nối: Pc

* nb Regex Perl này chỉ nhằm mục đích mô tả cú pháp - nó sẽ không hoạt động trong JavaScript, không bao gồm (chưa) bao gồm hỗ trợ cho Thuộc tính Unicode. (Có một số gói của bên thứ ba yêu cầu thêm hỗ trợ đó.)


Tôi dường như không thể có được regex này để thực sự làm việc. "test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === nullmặc dù "test" là tên biến JS hợp lệ
David Murdoch

Xin lỗi, nhưng JavaScript không hỗ trợ regex này. Tôi đã thêm một lưu ý để làm rõ.
danorton

5
Cần lưu ý rằng regex thứ hai của bạn có một số dương tính giả. Các ký tự Unicode bổ sung (ví dụ: Ideograph Tương thích U + 2F800 , được liệt kê trong danh mục [Lo]) không được phép trong các tên định danh , vì JavaScript diễn giải chúng thành hai nửa thay thế riêng lẻ (ví dụ \uD87E\uDC00) không khớp với bất kỳ Unicode nào được phép Thể loại. Regex của bạn, tuy nhiên, sẽ cho phép một nhân vật như vậy. Ngoài ra, U + 200C và U + 200D bị thiếu.
Mathias Bynens

1
ES6 chính thức định nghĩa các định danh hợp lệ bằng cách sử dụng các lớp ký tự có nghĩa rõ ràng cho mục đích này (sử dụng trong progamming) - không chắc điều này có đúng trước đây không - có nghĩa là bạn có thể tạo một biểu thức chính xác này dễ đọc hơn một chút, nếu không tính đến các từ dành riêng - hoặc ít nhất sẽ là nếu thực tế là các chuỗi thoát Unicode hiện cũng có giá trị trong các định danh! Điều này chính xác theo thông số 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] + \})) *
Dấu chấm phẩy

14

Trên thực tế, ECMAScript cho biết trên trang 15: Rằng một định danh có thể bắt đầu bằng $, gạch dưới hoặc UnicodeLetter, và sau đó nó tiếp tục (ngay bên dưới) để xác định rằng UnicodeLetter có thể là bất kỳ ký tự nào từ các catagode unicode, Lo, Ll , Lu, Lt, Lm và Nl. Và khi bạn tra cứu những giáo lý đó, bạn sẽ thấy rằng điều này mở ra nhiều khả năng hơn là chỉ các chữ cái Latinh. Chỉ cần tìm kiếm "catagories unicode" trong google và bạn có thể tìm thấy chúng.


Lỗi kết nối và tất cả 404 tôi nhận được cho mọi kết quả có liên quan khi googling cho ("danh mục unicode") ... :(
Calmarius

13

Biến Javascript

Bạn có thể bắt đầu một biến với bất kỳ chữ cái $hoặc _ký tự nào. Miễn là nó không bắt đầu bằng một số, bạn cũng có thể bao gồm các số.

Khởi đầu: [a-z], $, _

Lưu trữ: [a-z], [0-9], $, _

jQuery

Bạn có thể sử dụng _cho thư viện của mình để nó sẽ sát cánh với jQuery. Tuy nhiên, có một cấu hình bạn có thể đặt để jQuery không sử dụng $. Nó sẽ thay vì sử dụng jQuery. Để làm điều này, chỉ cần đặt:

jQuery.noConflict();

Trang này giải thích làm thế nào để làm điều này.


Điều này là hoàn toàn chính xác, nhưng tôi đã đưa ra câu trả lời cho Anthony, người đã trả lời .02123413124 mili giây trước bạn. Lấy làm tiếc.
Richard Clayton

8
@Richard: Không, nó không hoàn toàn chính xác. Xem câu trả lời của @Yuvalik và @ Anurag.
Tim Down

@EndangeredMassa tại sao sử dụng biến "_name"? Tại sao không chỉ là tên?
Tomasz Waszchot

9

Câu trả lời được chấp nhận sẽ loại trừ rất nhiều định danh hợp lệ , theo như tôi có thể thấy. Đây là một biểu thức chính quy mà tôi kết hợp với nhau nên tuân theo thông số kỹ thuật (xem chương 7.6 về định danh). Tạo nó bằng RegexBuddy và bạn có thể tìm thấy bản giải thích tại http://samples.geekality.net/js-identifier .

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

Ngoài ra, tên không thể là một trong những từ dành riêng sau đây.

break, do, instanceof, typeof, case, other, new, var, Catch, cuối cùng, return, void, continue, for, switch, while, debugger, function, this, with, default, if, throw, xóa, in, thử, lớp, enum, mở rộng, siêu, const, xuất, nhập, thực hiện, cho phép, riêng tư, công khai, năng suất, giao diện, gói, được bảo vệ, tĩnh, null, đúng, sai


Regex này không phải là một regex JS hợp lệ. Tôi nghĩ bạn có nghĩa là : ^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\u200C\u200D]*$. Bây giờ ngay cả với sự điều chỉnh tôi dường như không thể làm cho regex này thực sự hoạt động. "test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === nullmặc dù "test" là tên biến JS hợp lệ
David Murdoch

Không, tôi khá chắc chắn rằng tôi có nghĩa là những gì tôi đã viết :) Câu hỏi, như tôi đã hiểu, chỉ hỏi tên hàm javascript hợp lệ là gì, chứ không phải cách thức biểu thức chính xác trong javascript. Tôi đã tạo nó trong RegexBuddy và tôi đang sử dụng nó trong PHP trên trang mẫu mà tôi liên kết đến. Hoạt động tuyệt vời, và testđược chấp nhận là tốt.
Svish

3
@DavidMurdoch Tôi đã viết một biểu thức chính quy tương thích JavaScript 11.335 ký tự có thể được sử dụng để xác thực các định danh (còn gọi là tên biến). Xem câu trả lời của tôi .
Mathias Bynens

3
@Svish Cần lưu ý rằng regex của bạn có một số dương tính giả. Các ký tự Unicode bổ sung (ví dụ: Ideograph Tương thích U + 2F800 , được liệt kê trong danh mục [Lo]) không được phép trong các tên định danh , vì JavaScript diễn giải chúng thành hai nửa thay thế riêng lẻ (ví dụ \uD87E\uDC00) không khớp với bất kỳ Unicode nào được phép Thể loại. Regex của bạn, tuy nhiên, sẽ cho phép một nhân vật như vậy.
Mathias Bynens

2
@Svish Vâng vâng, bằng cách viết ra các dãy chính mình, như tôi đã làm :) Lưu ý rằng regex của bạn cũng không tính đến các eval, arguments, NaN, Infinityundefinedtrường hợp cạnh .
Mathias Bynens

6

Các biến Javascript có thể có chữ cái, chữ số, ký hiệu đô la ($) và dấu gạch dưới (_). Họ không thể bắt đầu bằng chữ số.

Thông thường các thư viện sử dụng $_làm lối tắt cho các chức năng mà bạn sẽ sử dụng ở mọi nơi. Mặc dù tên $hoặc _không có ý nghĩa, chúng vẫn hữu ích vì sự ngắn gọn của chúng và vì bạn sẽ sử dụng chức năng ở mọi nơi mà bạn mong đợi để biết ý nghĩa của chúng.

Nếu thư viện của bạn không bao gồm trên nhận được một chức năng duy nhất được sử dụng ở khắp mọi nơi, tôi muốn khuyên bạn nên sử dụng tên có ý nghĩa hơn là những người sẽ giúp bạn và những người khác hiểu những gì mã của bạn đang làm mà không nhất thiết ảnh hưởng đến mã nguồn giá trị nice .

Ví dụ, bạn có thể xem thư viện DateJS tuyệt vời và tại đường tổng hợp, nó cho phép mà không cần bất kỳ ký hiệu hoặc biến tên ngắn nào .

Trước tiên bạn nên làm cho mã của mình trở nên thiết thực và chỉ sau khi thử làm cho nó đẹp.


4

trong trường hợp các biểu thức thông thường không phải là bắt buộc, sẽ tốt hơn nếu chỉ yêu cầu trình duyệt quyết định sử dụng 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
Không, nó sẽ không. xss = alert("I'm in your vars executin mah scrip's");;;;;ví dụ không phải là tên biến javascript hợp lệ.
1j01

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

1
Đó là một ý tưởng khá thông minh, mặc dù lỗ hổng tấn công XSS.
Bàn chải đánh răng

@ 1j01 Làm thế nào về việc thay thế namebằng (typeof name === "string")? name.replace(/\(|\)/,"") : "_noXSS" )? Nếu đó là một chuỗi, nó sẽ thay thế dấu ngoặc đơn (chắc chắn không được phép trong các biến), vì vậy tôi nghĩ việc thực thi bất cứ điều gì sẽ gần như không thể.
royhowie

2
Vâng, sau đó isValidVarName('aler(t')trở thành sự thật. Và isValidVarName('_;;;')vẫn đúng. Nhưng bạn có thể kiểm tra khi bắt đầu xem nó có khớp với thứ gì đó không /[;,\(\)]/nhưng sau đó bạn vẫn có thể thực thi _=location="#!?"để bạn thêm =vào danh sách nhưng bạn vẫn có thể thực thi '_\ndelete foo'(vượt qua bài kiểm tra dưới dạng tên biến hợp lệ) để bạn phải loại trừ \ns và \rs và có thể một số dòng mới unicode? Nhưng `$` không phải là định danh hợp lệ nên bạn phải loại trừ tất cả khoảng trắng ... Đó là một trận thua. Tôi nghĩ đó là tất cả những gì tôi có thể đi ngược lại vớiif(/[;,\(\)=\s]/.exec(name))return!1
1j01

1

Đây là một gợi ý nhanh để tạo tên biến. Nếu bạn muốn biến không xung đột khi được sử dụng trong FireFox, không sử dụng tên biến " _content " vì tên biến này đã được trình duyệt sử dụng. Tôi đã tìm thấy điều này một cách khó khăn và phải thay đổi tất cả những nơi tôi đã sử dụng biến "_content" trong một ứng dụng JavaScript lớn.


Bạn có thể chứng minh điều này với một số mã nguồn không thành công? Nó không xuất hiện để làm bất cứ điều gì trong Firefox.
Bàn chải đánh răng

Đây là một jsfiddle rằng cảnh báo khi biến "_content" không phải là "không xác định" và khi "_content" được thiết lập bởi FireFox, nó được thiết lập để bình đẳng "window.content" jsfiddle.net/R2qvt/3
DanBrianWhite

1

Tôi đã lấy ý tưởng của Anas Nakawa và cải tiến nó. Trước hết, không có lý do để thực sự chạy chức năng được khai báo. Chúng tôi muốn biết liệu nó phân tích cú pháp chính xác, không phải là liệu mã có hoạt động hay không. Thứ hai, một đối tượng theo nghĩa đen là một bối cảnh tốt hơn cho mục đích của chúng tôi hơn var XXXlà khó thoát ra.

    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
Thậm chí đừng thử. isValidVarName('}; }); alert("I\'m in your vars executin\' mah scripts"); true; // yeah, super valid');
1j01

1
@ 1j01, Agh, tôi quên mất bình luận mã. Tôi đã hy vọng việc mất cân bằng của dấu ngoặc đơn có thể giữ cho mã không chạy. Một kiểm tra đơn giản cho }nên loại trừ đó.
cleong

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.