JavaScript değişken adları için hangi karakterler geçerlidir?


557

Bir JavaScript değişkenini adlandırmak için hangi karakterler kullanılabilir?

İş yerinde JavaScript olmayan kullanıcılarım için küçük bir "eklenti kütüphanesi" oluşturmak istiyorum. JQuery ve Prototype $dolar işareti kullanmak nasıl seviyorum ve jQuery kullandığım için kullanmak için başka bir güzel tek karakter sembolü arıyorum.

Birkaç karakteri test edebileceğimin farkındayım, ancak başlamak için karakter listemi daraltmayı umuyorum (belki de başka bir popüler kütüphane ile gelecekteki entegrasyon göz önüne alındığında).


44
HAYIR. Unicode harfler kabul edilebilir. Örneğin π deneyin.
nalply

14
Değişken adlarında unicode harfler kabul edilebilir olsa da, kodda unicode kullanmak sorunlu olabilir . Onlar olmadan alabilirsiniz eğer değişken isimlerinde kullanmamanızı öneririm.
Gary S. Weaver

F # geçerli bir değişken adı mı? Küçük bir işlevsel javascript kitaplığı inşa ediyorum ve modül adı için F # kullanmak istiyorum. Tipik bir işlev çağrısı şöyle görünür: F # .partial (fn, ... presetArgs);
Jules Manson

@JulesManson Hayır, çünkü pound simgesi diğer kullanımlar için ayrılmıştır.
Aidan Lovelace

@JulesManson Bu arada, F # ismi zaten Microsoft'tan .NET'ten alınmıştır
Luke the Geek

Yanıtlar:


986

Geçerli JavaScript değişken adlarını alıntılamak için , ilgili spesifikasyon bölümlerini özetleyen yazım:

Bir tanımlayıcı ile başlamalı $, _ya da Unicode kategoriler herhangi bir karakter “Büyük harf harf (Lu)” , “Küçük harf harf (LI)” , “İlk harfler büyük harf (Lt)” , “Değiştirici Harf (Am)” , “Diğer harfi ( Lo) ” veya “ Harf numarası (Nl) ” .

Dizenin geri kalanı aynı karakterleri, artı tüm U + 200C sıfır genişlikli birleştirme karakterlerini, U + 200D sıfır genişlikli marangoz karakterlerini ve Unicode kategorisinde “Aralıksız işaret (Mn)” , “Aralık birleştirme işareti (Mc) ” , “ Ondalık basamak sayısı (Nd) ” veya “ Bağlayıcı noktalama işareti (Pc) ” .

Ayrıca , girdiğiniz herhangi bir dizenin ECMAScript 5.1 ve Unicode 6.1'e göre geçerli bir JavaScript değişken adı olup olmadığını söyleyen bir araç oluşturdum :

JavaScript değişken adı doğrulayıcı


Not: Anthony Mills'in cevabının ne kadar yanlış olduğu hakkında bir fikir vermek için: tüm bu kuralları JavaScript için yalnızca tek bir ASCII normal ifadesinde özetleyecekseniz, 11.236 karakter uzunluğunda olurdu . İşte burada:

// 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
Bunu oluşturmanız için gereken süre boyunca size kredi vereceğim.
Richard Clayton

18
@marsbear Bunun hakkında da bir makale yazdım: mathiasbynens.be/notes/javascript-properties Ve bir araç da: mothereff.in/js-properties#12e34 İşte benim ilgili Yığın Taşması yanıtı .
Mathias Bynens

2
Kahretsin bu yüzden akıllı olamıyorum ve ¢tamamlayıcı olarak kullanamıyorum $... oh iyi ...)-:
hippietrail

3
Bu doğru (ve harika bir cevap). Ancak bu doğru olmaz: kodu benzer görünen, ancak gerçekte farklı olan harfleri (veya unicode olmayan ortamın kullanamayacağı harfleri kullanarak) şaşırtmak yanlıştır, imo. Kodlamaya yardımcı olmaz ve bunun yerine çok sayıda hata oluşturabilir. Tek iyi taraf: insanları (acı verici) bazı kodların Unicode kullanma olasılığını (ve Unicode ve farklı temsillerinin acıyla farkında olma) fark etmesini sağlayacaktır
Olivier Dulac

4
@ n2liquid-GuilhermeVieira Yalnızca tüm JavaScript motorlarının% 100 spesifikasyona uygun olduğunu varsayarsanız, bu her zaman geçerli değildir - bu araştırmayı yaptığımda emin değildim. Bağlantı verdiğim blog yazısı, dosyaladığım ve yamaladığım tüm tarayıcı / motor hatalarından bahsediyor.
Mathias Bynens

117

7.6 Tanımlayıcı Adları ve Tanımlayıcıları bölümündeki ECMAScript spesifikasyonundan geçerli bir tanımlayıcı şu şekilde tanımlanır:

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

Bu da değişkenleri adlandırmak ve golf oynamak için birçok fırsat yaratır. Bazı örnekleri deneyelim.

Geçerli bir tanımlayıcı ya bir ile başlayabilir UnicodeLetter, $, _, veya \ UnicodeEscapeSequence. Unicode harf bu kategorilerden herhangi bir karakterdir ( tüm kategorilere bakın ):

  • Büyük harf (Lu)
  • Küçük harf (Ll)
  • Titlecase mektubu (Lt)
  • Değiştirici harf (Lm)
  • Diğer mektup (Lo)
  • Harf numarası (Nl)

Bu tek başına bazı çılgın olasılıkları açıklar - çalışma örnekleri . Tüm tarayıcılarda çalışmıyorsa, hata olarak adlandırın, çünkü gerekir.

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

1
Örnek satırlarınızı şu anda bir JavaScript örneği olmayan bu Rosetta Kodu sayfasına kopyalayabilir misiniz ?
Walter Tross

73

Temel olarak, düzenli ifade biçiminde: [a-zA-Z_$][0-9a-zA-Z_$]*. Başka bir deyişle, ilk karakter bir harf veya _ veya $ olabilir ve diğer karakterler harf veya _ veya $ veya sayı olabilir.

Not: Diğer yanıtlar JavaScript tanımlayıcılarında Unicode karakterleri kullanabileceğinize işaret ederken, asıl soru "jQuery gibi bir uzantı kitaplığının adı için hangi karakterleri kullanmalıyım?" Bu, bu sorunun cevabıdır. Tanımlayıcılarda Unicode karakterleri kullanabilirsiniz, ancak bunu yapmayın. Kodlamalar her zaman berbat olur. Genel tanımlayıcılarınızı güvenli olduğu 32-126 ASCII aralığında tutun.


71
Muhtemelen etiket adlarında unicode karakterler kullanan bir ortak geliştiriciye suikast düzenleyeceğim. / ironik konuşma
Erik Reppen

12
romkyns, "Unicode karakter tanımlayıcı adları" nın "JavaScript: İyi Parçalar" a ekleneceğini düşünmüyorum ve bu nedenle, onların varlığını görmezden gelmeyi tercih ediyorum. Ancak, yararınıza cevabım için bir feragatname ekledim.
Anthony Mills

11
Kodlamalar ilgili olarak: lütfen yapmak için dize hazır en azından kullanım ASCII olmayan karakterler. Kodlamaları her zaman berbat eden tüm aptal yazılımları ortadan kaldırmalıyız. Sadece Console.WriteLine("привет")C # yazmak ve gerçekten çalışması için ne mutluluk !
Roman Starkov

14
Bakın, @Timwi, özellikle bir kütüphane yazarken (Richard'ın söylediği gibi), kullanıcılarınızı Alt-blah bokuna ya da copy'n'pasting'e zorlamayacaksınız. Ayrıca, kendi öğeleriniz için, tarayıcı veya proxy sunucusu hatalarıyla veya başka herhangi bir şeyle karşılaştığınızda ortaya çıkan sıkıntılarla uğraşmak iyi olabilir, ancak kitaplığınızın kullanıcılarının bu şeylerle uğraşması hoş değildir. İyi bir cevap "ne yapmalıyım" cevabını sadece mevcut soru ile ilgilenmekten daha fazlası. Evet, insanlara yardım etmek istiyorum. "Oh, ve bunu yapma" demedikçe işe yaramaz ve tehlikeli bilgileri eklemeyeceğim.
Anthony Mills

37
@Tchalvak Sadece kullandığınız kod için, ana kütüphane adınız olarak Ʒ kullanarak muhtemelen iyi. (Oh, bunun 3 olduğunu mu düşünüyordun? Çok üzgünüm, aslında U + 01B7 Latin Büyük Harfi Ezh! Yoksa Kiril alfabesi harfleri Ze mu?) Ancak, muhtemelen ASCII'ye bağlı kalmak en iyisidir.
Anthony Mills

18

JavaScript 1.5'ten önce: ^[a-zA-Z_$][0-9a-zA-Z_$]*$

İngilizce: Bir dolar işareti, alt çizgi ya da 26 karakterlik alfabedeki büyük ya da küçük harflerden biri ile başlamalıdır. Sonraki karakterler (varsa) bunlardan herhangi biri veya ondalık basamak olabilir.

JavaScript 1.5 ve üstü * :^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$

Bunu İngilizce olarak ifade etmek daha zordur, ancak kavramsal olarak eski sözdizimine benzer ve harfler ve rakamlar herhangi bir dilden olabilir. İlk karakterden sonra ek alt çizgi benzeri karakterlere (topluca “bağlayıcılar” denir) ve ek karakter birleştirme işaretlerine (“değiştiriciler”) izin verilir. (Bu genişletilmiş kümeye diğer para birimi simgeleri dahil değildir.)

JavaScript 1.5 ve üstü , sonucun yukarıdaki normal ifadede izin verilecek bir karakter olması koşuluyla Unicode kaçış dizilerine de izin verir .

Tanımlayıcılar ayrıca geçerli bir ayrılmış sözcük veya ileride kullanılmak üzere kabul edilen bir sözcük olmamalıdır.

Bir tanımlayıcının uzunluğu için pratik bir sınır yoktur. (Tarayıcılar değişiklik gösterir, ancak güvenle 1000 karaktere ve muhtemelen bundan daha fazla büyüklüğe sahip olursunuz.)

Karakter kategorilerine bağlantılar:

  • Harfler: Lu , Ll , Lt , Lm , Lo , Nl
    (yukarıdaki normal ifadede “L” olarak birleştirilmiştir)
  • İşaretleri birleştirme (“değiştiriciler”): Mn , Mc
  • Basamak: Nd
  • Konektörler: Pc

* nb Bu Perl regex sadece sözdizimini tanımlamak için tasarlanmıştır - JavaScript'te çalışmaz, henüz Unicode Özellikleri için destek içermez. (Bu tür bir destek eklediğini iddia eden bazı üçüncü taraf paketleri vardır.)


Bu normal ifadeyi gerçekten işe yarayacak gibi görünmüyorum. "test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === null"test" geçerli bir JS değişken adı olmasına rağmen
David Murdoch

Maalesef, JavaScript bu normal ifadeyi desteklemiyor. Açıklığa kavuşturmak için bir not ekledim.
danorton

5
İkinci normal ifadenizin bazı yanlış pozitifleri olduğu unutulmamalıdır. Ek Unicode karakterleri (örneğin U + 2F800 CJK uyumluluk ideograph [Lo] kategorisinde listelenir,) vardır tanımlayıcının isimlerinde izin verilmeyen iki ayrı vekil yarıları (örn olarak JavaScript yorumladığını gibi onları \uD87E\uDC00izin Unicode herhangi eşleşmiyor) kategoriler. Bununla birlikte, normal ifadeniz böyle bir karaktere izin verir. Ayrıca, U + 200C ve U + 200D eksik.
Mathias Bynens

1
ES6, bu amaç için açıkça ifade edilen karakter sınıflarını (programlamada kullanım) kullanarak geçerli tanımlayıcıları resmi olarak tanımlar - bunun daha önce doğru olup olmadığından emin değilim - bu, rezerve kelimeleri hesaba katmazsanız biraz daha okunabilir hale getirebilirsiniz - veya en azından Unicode kaçış dizilerinin artık tanımlayıcılarda da geçerli olmasaydı olurdu! Bu, ES6 spesifikasyonuna göre doğrudur: (?: [\ P {ID_Start} \ $ _] | \\ u (?: [\ DA-Fa-f] {4} | \ {[\ dA-Fa-f ] + \})) ([\ s {ID_Continue} \ $ _ \ u200C \ u200D] | \\ u (: [\ dA-Fa-f] {4} | \ {[\ dA-Fa-f] + \})) *
Noktalı virgül

14

Aslında, ECMAScript sayfa 15: Bir tanımlayıcının bir $, alt çizgi veya bir UnicodeLetter ile başlayabileceğini ve daha sonra (hemen altında) UnicodeLetter'ın unicode kategorilerinden herhangi bir karakter olabileceğini belirtmek için devam ediyor, Lo, Ll , Lu, Lt, Lm ve Nl. Ve bu kategorilere baktığınızda bunun latin harflerinden çok daha fazla olasılık açtığını göreceksiniz. Google'da "unicode kategorileri" için arama yapmanız yeterlidir.


("Unicode kategorileri") için googling yaparken ilgili tüm sonuçlar için bağlantı hataları ve
404'lerin tümü

13

Javascript Değişkenleri

Bir değişkeni herhangi bir harf $veya _karakterle başlatabilirsiniz . Bir sayı ile başlamadığı sürece sayı da ekleyebilirsiniz.

Başlat: [a-z], $, _

içeriyor: [a-z], [0-9], $, _

jQuery

_Kütüphaneniz için jQuery ile yan yana duracak şekilde kullanabilirsiniz . Ancak, jQuery kullanmayacak şekilde ayarlayabileceğiniz bir yapılandırma vardır $. Bunun yerine kullanacaktır jQuery. Bunu yapmak için şunu ayarlayın:

jQuery.noConflict();

Bu sayfada bunun nasıl yapılacağı açıklanmaktadır.


Bu kesinlikle doğru, ama cevabını senden önce .02123413124 milisaniye cevaplayan Anthony'ye verdim. Afedersiniz.
Richard Clayton

8
@Richard: Hayır, kesinlikle doğru değil. @Yuvalik ve @ Anurag'ın cevaplarına bakınız.
Tim Down

@EndangeredMassa neden "_name" değişkeni kullanılıyor? neden sadece isim değil?
Tomasz Waszczyk

9

Kabul edilen cevap , görebildiğim kadarıyla birçok geçerli tanımlayıcıyı ekarte eder . Bir araya getirdiğim ve spesifikasyonları izlemesi gereken düzenli bir ifade (tanımlayıcılar için bölüm 7.6'ya bakın). RegexBuddy kullanarak oluşturdunuz ve açıklamanın bir ihracatını http://samples.geekality.net/js-identifiers adresinde bulabilirsiniz .

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

Ayrıca, ad aşağıdaki ayrılmış sözcüklerden biri olamaz.

break, do, instanceof, typeof, dava, başka, yeni, var, yakalamak, nihayet, geri, geçersiz, devam, için, anahtarı, süre, hata ayıklayıcı, fonksiyonu, bu, varsayılan, eğer, atmak, silmek, içinde, deneyin, sınıf, numaralandırma, uzanır, süper, const, dışa aktarma, alma, uygular, let, özel, genel, verim, arabirim, paket, korumalı, statik, null, doğru, yanlış


Bu normal ifade geçerli bir JS normal ifadesi değil. Ne demek düşünüyorum: ^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\u200C\u200D]*$. Şimdi düzeltmeyle bile, bu normal ifadenin gerçekten işe yaramasını sağlayamıyorum. "test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === null"test" geçerli bir JS değişken adı olmasına rağmen
David Murdoch

Hayır, ne yazdığımı kastettiğime eminim :) Anladığım kadarıyla, sadece geçerli bir javascript işlev adının ne olduğunu sordum, bunun için bir regex nasıl özellikle javascript olurdu. RegexBuddy'de yaptım ve bağlandığım örnek sayfada PHP kullanıyorum. Harika çalışıyor ve testkabul ediliyor.
Svish

3
@DavidMurdoch Tanımlayıcıları doğrulamak için kullanılabilecek 11,335 karakterlik JavaScript uyumlu bir normal ifade yazdım (değişken adları). Cevabımı gör .
Mathias Bynens

3
@Vish Regex'inizde bazı yanlış pozitifler olduğu unutulmamalıdır. Ek Unicode karakterleri (örneğin U + 2F800 CJK uyumluluk ideograph [Lo] kategorisinde listelenir,) vardır tanımlayıcının isimlerinde izin verilmeyen iki ayrı vekil yarıları (örn olarak JavaScript yorumladığını gibi onları \uD87E\uDC00izin Unicode herhangi eşleşmiyor) kategoriler. Bununla birlikte, normal ifadeniz böyle bir karaktere izin verir.
Mathias Bynens

2
Evet Eh @Svish, benim yaptığım gibi, kendini reklam aralıklarını yazma :) Not sizin normal ifadenin aynı hesaba etmediğini tarafından , , , ve kenar durumlarda . evalargumentsNaNInfinityundefined
Mathias Bynens

6

Javascript değişkenleri harf, rakam, dolar işareti ($) ve alt çizgi (_) içerebilir. Rakamlarla başlayamazlar.

Genellikle kütüphaneler her yerde kullanacağınız işlevler için $ve _kısayolları olarak kullanır. İsimleri $veya_ anlamlı , kısa olmaları için faydalıdırlar ve her yerde işlevi kullandığınızdan, ne anlama geldiğini bilmeniz beklenir.

Tek bir fonksiyonu alma konusunda oluşmuyor sizin kütüphane her yerde kullanılıyor Eğer size yardımcı olacaktır olanlar gibi daha anlamlı adlar kullanır ve diğerleri kodunuzu mutlaka kaynak kodu ödün vermeden ne yaptığını anlamak, ben tavsiye ederim incelik .

Örneğin, harika DateJS kütüphanesine ve herhangi bir sembol veya kısa adlı değişkene ihtiyaç duymadan izin verdiği sözdizim şekerine bir göz atabilirsiniz .

Önce kodunuzun pratik olmasını sağlamalısınız ve ancak güzelleştirmeyi denedikten sonra.


4

düzenli ifadelerin şart olmaması durumunda, tarayıcıdan kullanmaya karar vermesini istemek daha iyi olmaz evalmı?

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
Hayır. xss = alert("I'm in your vars executin mah scrip's");;;;;örneğin, geçerli bir javascript değişken adı değil.
1j01

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

1
XSS saldırı güvenlik açığına rağmen oldukça zekice bir fikir.
Diş fırçası

1j01 @ nasıl değiştirilmesi hakkında namesahip (typeof name === "string")? name.replace(/\(|\)/,"") : "_noXSS" )? Bir dize ise, parantez yerine geçecektir (kesinlikle değişkenlerde izin verilmez), bu yüzden bir şey yürütmek neredeyse imkansız olacağını düşünüyorum.
royhowie

2
O zaman isValidVarName('aler(t')gerçek olur. Ve isValidVarName('_;;;')gerçek kalıyor. Ancak başlangıçta bunun gibi bir şeyle eşleşip eşleşmediğini kontrol /[;,\(\)]/edebilirsiniz , ancak listeye _=location="#!?"eklemek =için yine de yürütebilirsiniz , ancak yine de yürütebilirsiniz '_\ndelete foo'(bu, testi geçerli bir değişken adı olarak geçer) \nve \rs ve s'yi hariç tutmanız gerekir ve belki Unicode yeni satır? Ancak `$ 'geçerli bir tanımlayıcı değil, bu yüzden tüm boşlukları hariç tutmanız gerekiyor ... Bu kaybedilen bir savaş. Bence kendime karşı gidebildiğim kadarıylaif(/[;,\(\)=\s]/.exec(name))return!1
1j01

1

İşte değişken adları oluşturmak için hızlı bir öneri. Değişkenin FireFox'ta kullanıldığında çakışmamasını istiyorsanız, do not değişken ismi "kullanmak _content zaten tarayıcı tarafından kullanılıyor bu değişken adı olarak". Bunu zor yoldan öğrendim ve büyük bir JavaScript uygulamasında "_content" değişkenini kullandığım tüm yerleri değiştirmek zorunda kaldım.


Bunu başarısız olan bazı kaynak kodlarıyla ispatlayabilir misiniz? Firefox'ta hiçbir şey yapmıyor gibi görünüyor.
Diş fırçası

İşte "_content" değişkeni "undefined" olmadığında ve "_content" FireFox tarafından ayarlandığında, "window.content" e eşit olacak şekilde uyarı veren bir jsfiddle'dır. Jsfiddle.net/R2qvt/3
DanBrianWhite

1

Anas Nakawa'nın fikrini aldım ve geliştirdim. Her şeyden önce, beyan edilen işlevi gerçekten çalıştırmak için hiçbir neden yoktur. Kodun çalışıp çalışmadığını değil, doğru ayrışıp ayrışmadığını bilmek istiyoruz. İkincisi, gerçek bir nesne, amacımız var XXXiçin kırılması daha zor olduğundan daha iyi bir bağlamdır .

    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
Deneme bile. isValidVarName('}; }); alert("I\'m in your vars executin\' mah scripts"); true; // yeah, super valid');
1j01

1
@ 1j01, Agh, kod yorumunu unuttum. Tek başına parantezlerin dengesizliğinin kodun çalışmasını engelleyebileceğini umuyordum. Basit bir kontrol }bunu engellemelidir.
cleong

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.