जावास्क्रिप्ट चर नामों के लिए कौन से वर्ण मान्य हैं?


557

जावास्क्रिप्ट चर का नामकरण करने के लिए कौन से वर्णों का उपयोग किया जा सकता है?

मैं अपने गैर-जावास्क्रिप्ट उपयोगकर्ताओं के लिए काम पर एक छोटा "विस्तार पुस्तकालय" बनाना चाहता हूं (जो भाषा में आने पर सभी को स्क्वीश लगता है)। मुझे पसंद है कि jQuery और प्रोटोटाइप दोनों ने $डॉलर चिह्न का उपयोग कैसे किया है , और जब से मैं jQuery का उपयोग करता हूं, तो मैं उपयोग करने के लिए एक और अच्छा एकल-वर्ण प्रतीक ढूंढ रहा हूं।

मुझे एहसास है कि मैं बस कई पात्रों का परीक्षण कर सकता हूं, लेकिन मैं शुरू करने के लिए अपने पात्रों की सूची को कम करने की उम्मीद कर रहा हूं (एक अन्य लोकप्रिय पुस्तकालय के साथ भविष्य के एकीकरण के विचार में)।


44
नहीं। यूनिकोड पत्र स्वीकार्य हैं। उदाहरण के लिए for का प्रयास करें।
nalply

14
हालांकि यूनिकोड अक्षर चर नामों में स्वीकार्य हैं, लेकिन कोड में यूनिकोड का उपयोग समस्याग्रस्त हो सकता है । यदि आप उनके बिना प्राप्त कर सकते हैं तो मैं उन्हें चर नामों में उपयोग न करने का सुझाव दूंगा।
गैरी एस वीवर

F # एक वैध चर नाम है? मैं एक छोटी कार्यात्मक जावास्क्रिप्ट लाइब्रेरी बना रहा हूं और मैं इसके मॉड्यूल नाम के लिए F # का उपयोग करना चाहता हूं। एक विशिष्ट फ़ंक्शन कॉल इस तरह दिखेगा: F # .partial (fn, ... presetArgs);
जूल्स मैनसन

@JulesManson नहीं, क्योंकि पाउंड प्रतीक अन्य उपयोगों के लिए आरक्षित है।
ईडन लवलेस

@JulesManson वैसे, F # नाम पहले से ही Microsoft द्वारा .NET से लिया गया है
ल्यूक द गीक

जवाबों:


986

मान्य जावास्क्रिप्ट वैरिएबल नामों को उद्धृत करने के लिए , संबंधित विशिष्ट अनुभागों को सारांशित करते हुए मेरा लेखन:

एक पहचानकर्ता के साथ प्रारंभ होना $, _या यूनिकोड श्रेणियों में किसी भी चरित्र "अपरकेस अक्षर (लू)" , "लोअरकेस पत्र (एलएल)" , "Titlecase पत्र (लेफ्टिनेंट)" , "संशोधक पत्र (एल एम)" , "अन्य पत्र ( लो) ” , या “ लेटर नंबर (एनएल) ”

स्ट्रिंग के बाकी हिस्सों में समान वर्ण हो सकते हैं, साथ ही कोई भी U + 200C शून्य चौड़ाई गैर-योजक वर्ण, U + 200D शून्य चौड़ाई योजक वर्ण और यूनिकोड श्रेणियों के वर्ण "नॉन-स्पेसिंग मार्क (Mn)" , "स्पेसिंग संयोजन" चिह्न (Mc) " , " दशमलव अंक संख्या (एन डी) " , या " कनेक्टर विराम चिह्न (पीसी) "

मैंने एक उपकरण भी बनाया है जो आपको बताएगा कि आपके द्वारा दर्ज किया गया कोई स्ट्रिंग ECMAScript 5.1 और यूनीकोड ​​6.1 के अनुसार एक मान्य जावास्क्रिप्ट चर नाम है:

जावास्क्रिप्ट चर नाम सत्यापनकर्ता


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
मैं आपको इसे उत्पन्न करने में लगने वाले समय का श्रेय दूंगा।
रिचर्ड क्लेटन

18
@marsbear मैं उस पर भी एक लेख लिखा है: mathiasbynens.be/notes/javascript-properties और एक उपकरण, भी: mothereff.in/js-properties#12434 यहाँ मेरा एक प्रासंगिक ढेर अतिप्रवाह उत्तर है।
मैथियास ब्यनेंस

2
दमिति इसलिए मैं स्मार्ट नहीं हो सकता और ¢पूरक करने के लिए उपयोग नहीं कर सकता $... ओह अच्छी तरह से ...)-:
hippietrail

3
यह सच है (और एक भयानक जवाब)। हालाँकि यह इसे सही नहीं बनाता है: समान-दिखने वाले लेकिन वास्तव में अलग-अलग अक्षरों का उपयोग करके (या गैर-यूनिकोड वातावरण का उपयोग नहीं कर सकने वाले अक्षरों का उपयोग करके) कोड गलत है, गलत है। यह कोडिंग में मदद नहीं करेगा, और इसके बजाय कई बग बना सकता है। केवल अच्छा उल्टा: यह लोगों (दर्दनाक) को इस संभावना से अवगत कराएगा कि कुछ कोड यूनिकोड (और यूनिकोड और इसके अलग-अलग प्रतिनिधित्वों के बारे में दर्द से अवगत) का उपयोग करते हैं ... यूनिकोड के बारे में: joelonsoftware.com/articles/Unode.html
ओलिवियर

4
@ n2liquid-GuilhermeVieira केवल यदि आप मान लें कि सभी जावास्क्रिप्ट इंजन 100% युक्ति-संगत हैं, जो हमेशा ऐसा नहीं होता है - तो यकीन है कि जब मैंने यह शोध नहीं किया था। मैंने जिस ब्लॉग पोस्ट को लिंक किया है उसमें सभी ब्राउज़र / इंजन बग्स हैं जो मैंने दायर किए और पैच किए।
मैथियास ब्यनेंस

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। एक यूनिकोड पत्र इन श्रेणियों में से कोई भी वर्ण है ( सभी श्रेणियां देखें ):

  • अपरकेस अक्षर (लू)
  • लोअरकेस अक्षर (Ll)
  • शीर्षक पत्र (लेफ्टिनेंट)
  • संशोधक पत्र (एलएम)
  • अन्य पत्र (लो)
  • पत्र संख्या (Nl)

यह अकेले कुछ पागल संभावनाओं के लिए जिम्मेदार है - काम करने के उदाहरण । यदि यह सभी ब्राउज़रों में काम नहीं करता है, तो इसे बग कहो, इसका कारण बनना चाहिए।

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

1
क्या आप इस रोसेटा कोड पृष्ठ पर अपनी उदाहरण लाइनों को कॉपी कर सकते हैं , जिसमें वर्तमान में जावास्क्रिप्ट उदाहरण का अभाव है?
वाल्टर ट्रॉस

73

मूल रूप से, नियमित अभिव्यक्ति रूप में [a-zA-Z_$][0-9a-zA-Z_$]*:। दूसरे शब्दों में, पहला वर्ण एक अक्षर या _ या $ हो सकता है, और अन्य वर्ण अक्षर या _ या $ या संख्याएँ हो सकते हैं।

नोट: जबकि अन्य उत्तरों ने बताया है कि आप जावास्क्रिप्ट पहचानकर्ताओं में यूनिकोड वर्णों का उपयोग कर सकते हैं, वास्तविक सवाल यह था कि "मुझे jQuery जैसी एक्सटेंशन लाइब्रेरी के नाम के लिए किन वर्णों का उपयोग करना चाहिए?" यह उस प्रश्न का उत्तर है। आप यूनिकोड वर्णों का उपयोग पहचानकर्ताओं में कर सकते हैं, लेकिन ऐसा न करें। एनकोडिंग हर समय खराब हो जाती है। अपने सार्वजनिक पहचानकर्ताओं को 32-126 ASCII श्रेणी में रखें जहां यह सुरक्षित है।


71
मैं शायद एक सह-डेवलपर की हत्या करने की साजिश रचूंगा, जो अपने लेबल नामों में यूनिकोड वर्णों का उपयोग करता है। / मुश्किल से विडंबनापूर्ण भाषण
एरिक रेपेने

12
romkyns, मुझे नहीं लगता कि "यूनिकोड चरित्र पहचानकर्ता नाम" को कभी भी "जावास्क्रिप्ट: द गुड पार्ट्स" में शामिल किया जाएगा, और इस तरह, मैं उनके अस्तित्व को अनदेखा करना पसंद करता हूं। हालाँकि, मैंने आपके लाभ के लिए मेरे उत्तर में एक अस्वीकरण जोड़ दिया है।
एंथनी मिल्स

11
एन्कोडिंग के बारे में: कृपया कर अपने स्ट्रिंग शाब्दिक में, उपयोग गैर- ASCII वर्ण कम से कम। हमें उन सभी बेवकूफ सॉफ़्टवेयर को खत्म करना होगा जो एनकोडिंग "हर समय खराब हो जाते हैं"। Console.WriteLine("привет")सी # में टाइप करने के लिए क्या आनंद है और क्या यह वास्तव में काम करता है !
रोमन स्टार्कोव

14
देखिए, @Timwi, खासकर जब आप एक पुस्तकालय लिख रहे हों (जैसा कि रिचर्ड कहते हैं कि वह है), यह आपके उपयोगकर्ताओं को Alt-blah बकवास या copy'n'pasting में मजबूर नहीं करने के लिए तरह है। इसके अलावा, अपने स्वयं के सामान के लिए, आप उस गड़बड़ी से निपटने में ठीक हो सकते हैं जब आप ब्राउज़र या प्रॉक्सी सर्वर बग या जो कुछ भी करते हैं उसमें फसल होती है, लेकिन उस सामान के साथ आपके पुस्तकालय के उपयोगकर्ताओं को बनाना शांत नहीं होता है। एक अच्छा जवाब उत्तर देता है "मुझे क्या करना चाहिए" हाथ पर सवाल से निपटने से अधिक। इसलिए हां, मैं लोगों की मदद करना चाहता हूं। मैं बेकार और खतरनाक जानकारी को शामिल नहीं करने जा रहा हूं, जब तक कि मैं नहीं कहता कि "ओह, और यह मत करो।"
एंथनी मिल्स

37
@Tchalvak कोड के लिए जो आप उपयोग कर रहे हैं, वह शायद ठीक है, अपने मुख्य पुस्तकालय नाम के रूप में For का उपयोग कर। (ओह, आपने सोचा था कि यह एक 3 था? इसलिए क्षमा करें, यह वास्तव में U + 01B7 लैटिन कैपिटल लेटर पत्र Ezh है? या क्या यह ill, सिरिलिक कैपिटल लेटर ज़ी था?) यदि आप एक पुस्तकालय लिखने जा रहे हैं जो अन्य लोगों द्वारा उपयोग किया जा सकता है? , हालांकि, यह शायद ASCII से चिपकना सबसे अच्छा है।
एंथनी मिल्स

18

जावास्क्रिप्ट 1.5 से पहले: ^[a-zA-Z_$][0-9a-zA-Z_$]*$

अंग्रेजी में: यह एक डॉलर चिह्न, अंडरस्कोर या अक्षरों में से एक के साथ 26-वर्ण वर्णमाला, ऊपरी या निचले मामले में शुरू होना चाहिए। इसके बाद के अक्षर (यदि हो तो) उनमें से किसी एक या दशमलव अंक में से एक हो सकते हैं।

जावास्क्रिप्ट 1.5 और बाद में * :^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$

यह अंग्रेजी में व्यक्त करने के लिए अधिक कठिन है, लेकिन यह वैचारिक रूप से पुराने सिंटैक्स के समान है जिसमें अक्षर और अंक किसी भी भाषा से हो सकते हैं। पहले चरित्र के बाद, अतिरिक्त अंडरस्कोर जैसे वर्ण (सामूहिक रूप से "कनेक्टर्स") और अतिरिक्त वर्ण संयोजन अंक ("संशोधक") की अनुमति भी है। (अन्य मुद्रा प्रतीकों को इस विस्तारित सेट में शामिल नहीं किया गया है।)

जावास्क्रिप्ट 1.5 और बाद में यूनिकोड से बचने के क्रम को भी अनुमति देता है, बशर्ते कि परिणाम एक ऐसा चरित्र है जिसे उपरोक्त नियमित अभिव्यक्ति में अनुमति दी जाएगी।

पहचानकर्ताओं को वर्तमान आरक्षित शब्द या भविष्य के उपयोग के लिए माना जाने वाला शब्द नहीं होना चाहिए।

एक पहचानकर्ता की लंबाई के लिए कोई व्यावहारिक सीमा नहीं है। (ब्राउज़र भिन्न होते हैं, लेकिन आपके पास सुरक्षित रूप से 1000 वर्ण होंगे और शायद उससे अधिक परिमाण के कई आदेश हैं।)

चरित्र श्रेणियों के लिए लिंक:


* nb यह पर्ल रेगेक्स केवल वाक्यविन्यास का वर्णन करने के लिए है - यह जावास्क्रिप्ट में काम नहीं करेगा, जो (अभी तक) यूनिकोड गुणों के लिए समर्थन शामिल नहीं करता है। (कुछ तृतीय-पक्ष पैकेज हैं जो इस तरह के समर्थन को जोड़ने का दावा करते हैं।)


मैं वास्तव में काम करने के लिए इस regex प्राप्त करने के लिए प्रतीत नहीं कर सकते। "test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === nullभले ही "परीक्षण" एक वैध जेएस चर नाम है
डेविड मर्डोक

क्षमा करें, लेकिन जावास्क्रिप्ट इस रेगेक्स का समर्थन नहीं करता है। मैंने स्पष्ट करने के लिए एक नोट जोड़ा है।
danorton

5
यह ध्यान दिया जाना चाहिए कि आपके दूसरे रेगेक्स में कुछ झूठी सकारात्मकताएं हैं। अनुपूरक यूनिकोड वर्ण (जैसे U + 2F800 CJK संगतता आइडियोग्राफ़ , जिसे [Lo] श्रेणी में सूचीबद्ध किया गया है) को पहचानकर्ता नामों में अस्वीकृत कर दिया जाता है , क्योंकि जावास्क्रिप्ट उन्हें दो अलग-अलग सरोगेट हाफ़ (उदाहरण \uD87E\uDC00) के रूप में व्याख्या करता है, जो अनुमत यूनिकोड में से किसी से मेल नहीं खाता है। श्रेणियाँ। आपका रेगेक्स, हालांकि, इस तरह के चरित्र की अनुमति देगा। इसके अलावा, U + 200C और U + 200D गायब हैं।
मथियास बीनेंस

1
ES6 औपचारिक रूप से वैध पहचानकर्ताओं को परिभाषित करता है जो इस उद्देश्य के लिए स्पष्ट रूप से इस उद्देश्य के लिए उपयोग करते हैं (progamming में उपयोग करें) - सुनिश्चित नहीं कि यदि यह पहले सच था - तो आप इस regex को थोड़ा अधिक पठनीय बना सकते हैं, यदि आरक्षित शब्दों को ध्यान में नहीं रखा जाए - या कम से कम यह होगा यदि यह इस तथ्य के लिए नहीं था कि यूनिकोड एस्केप अनुक्रम अब पहचानकर्ताओं में भी मान्य हैं! यह ES6 युक्ति के अनुसार सटीक है: (!?: [\ P {ID_Start} \ $ _ ]_\ u (?: [[DA-Fa-f] {4} | \ {[\ d-Fa-f] ] \})) ([\ p \ {ID_Continue} $ _ \ u200C \ u200D] | \\ यू (: [\ dA-एफए च] {4} | \ {[\ dA-एफए च] + (})) *
अर्धविराम

14

वास्तव में, ECMAScript 15 पृष्ठ पर कहता है: एक पहचानकर्ता $, एक अंडरस्कोर या यूनिकोडलेटर के साथ शुरू हो सकता है, और फिर यह (इसके ठीक नीचे) पर जाता है यह निर्दिष्ट करने के लिए कि यूनिकोड कैटलटर यूनिकोड कैटेगरीज, लो, एलएल से कोई भी चरित्र हो सकता है। , लू, लेफ्टिनेंट, एलएम और एनएल। और जब आप उन कैटगरीज को देखते हैं तो आप देखेंगे कि यह सिर्फ लैटिन अक्षरों की तुलना में बहुत अधिक संभावनाएं खोलता है। बस Google में "यूनिकोड कैटागरीज" की खोज करें और आप उन्हें पा सकते हैं।


कनेक्शन त्रुटियों और 404 के सभी मैं हर प्रासंगिक परिणामों के लिए मिलता है जब ("यूनिकोड श्रेणियों") के लिए googling ...:
Calmarius

13

जावास्क्रिप्ट चर

आप किसी भी पत्र $, या _चरित्र के साथ एक चर शुरू कर सकते हैं । जब तक यह एक संख्या से शुरू नहीं होता है, तब तक आप संख्याओं को भी शामिल कर सकते हैं।

शुरू: [a-z], $, _

होते हैं: [a-z], [0-9], $, _

jQuery

आप _अपने पुस्तकालय के लिए उपयोग कर सकते हैं ताकि यह jQuery के साथ-साथ खड़ा हो। हालाँकि, एक कॉन्फ़िगरेशन है जिसे आप सेट कर सकते हैं ताकि jQuery का उपयोग न हो $। इसके बजाय उपयोग होगा jQuery। ऐसा करने के लिए, बस सेट करें:

jQuery.noConflict();

यह पृष्ठ बताता है कि यह कैसे करना है।


यह बिल्कुल सही है, लेकिन मैंने एंथनी को जवाब दिया जिन्होंने आपके सामने .02123413124 मिलीसेकंड का जवाब दिया। माफ़ करना।
रिचर्ड क्लेटन

8
@ रिचर्ड: नहीं, यह बिल्कुल सही नहीं है। @Yuvalik और @ अनुराग के जवाब देखें।
टिम डाउन

@EndangeredMassa चर "_name" का उपयोग क्यों करें? सिर्फ नाम ही क्यों?
टॉमाज़ वाज़्ज़की

9

स्वीकृत उत्तर बहुत सारे वैध पहचानकर्ताओं को नियंत्रित करेगा , जहाँ तक मैं देख सकता हूँ। यहां एक नियमित अभिव्यक्ति है जो मैंने एक साथ रखी है जो कल्पना का पालन करना चाहिए (पहचानकर्ताओं पर अध्याय 7.6 देखें)। इसे RegexBuddy का उपयोग करके बनाया गया है और आप http://samples.geekality.net/js-identifiers पर स्पष्टीकरण का निर्यात पा सकते हैं ।

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

इसके अलावा, नाम निम्नलिखित आरक्षित शब्दों में से एक नहीं हो सकता है।

ब्रेक, डू, इंस्टा, टाइपो, केस, और, नया, वर, कैच, अंत में, वापसी, शून्य, जारी, के लिए, स्विच, जबकि, डिबगर, फ़ंक्शन, यह, डिफ़ॉल्ट, अगर, फेंक, हटाना, में, कोशिश करो, वर्ग, एनम, फैली, सुपर, कास्ट, एक्सपोर्ट, इम्पोर्ट, इम्प्लीमेंट्स, लेट, प्राइवेट, पब्लिक, यील्ड, इंटरफेस, पैकेज, प्रोटेक्टेड, स्टैटिक, नल, ट्रू, फाल्स


यह रेगेक्स एक वैध जेएस रेगेक्स नहीं है। मुझे लगता है कि आपका मतलब है ^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\u200C\u200D]*$:। अब भी सुधार के साथ मैं वास्तव में काम करने के लिए इस regex प्राप्त करने के लिए प्रतीत नहीं कर सकते। "test".match(/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/) === nullभले ही "परीक्षण" एक मान्य जेएस चर नाम है
डेविड मर्डोक

नहीं, मुझे पूरा यकीन है कि मेरा मतलब है कि मैंने क्या लिखा है: सवाल, जैसा कि मैंने समझा, बस एक मान्य जावास्क्रिप्ट फ़ंक्शन नाम के लिए कहा है, न कि कैसे एक रेगेक्स विशेष रूप से जावास्क्रिप्ट में होगा। मैंने इसे RegexBuddy में बनाया है और मैं इसे PHP में उस सैंपल पेज पर उपयोग कर रहा हूं जिसे मैं लिंक करता हूं। महान काम करता है, और testसाथ ही स्वीकार किया जाता है।
शविश

3
@DavidMurdoch मैंने एक 11,335-चरित्र जावास्क्रिप्ट-संगत नियमित अभिव्यक्ति लिखी है जिसका उपयोग पहचानकर्ताओं (उर्फ चर नामों) को मान्य करने के लिए किया जा सकता है। मेरा जवाब देखिए ।
मथियास बीनेंस

3
@ सविश यह ध्यान दिया जाना चाहिए कि आपके रेगेक्स में कुछ गलत सकारात्मकताएं हैं। अनुपूरक यूनिकोड वर्ण (जैसे U + 2F800 CJK संगतता आइडियोग्राफ़ , जिसे [Lo] श्रेणी में सूचीबद्ध किया गया है) को पहचानकर्ता नामों में अस्वीकृत कर दिया जाता है , क्योंकि जावास्क्रिप्ट उन्हें दो अलग-अलग सरोगेट हाफ़ (उदाहरण \uD87E\uDC00) के रूप में व्याख्या करता है, जो अनुमत यूनिकोड में से किसी से मेल नहीं खाता है। श्रेणियाँ। आपका रेगेक्स, हालांकि, इस तरह के चरित्र की अनुमति देगा।
मथियास ब्यनेंस 12

2
खैर @Svish हाँ, अपने आप को सीमाओं का लेखन, जैसे मैंने किया था :) ध्यान रखें कि आपके रेगुलर एक्सप्रेशन से भी के लिए खाते में नहीं है से , , , और किनारे मामलोंevalargumentsNaNInfinityundefined
मथियास बीनेंस

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
यह काफी चतुर विचार है, एक्सएसएस हमले की भेद्यता के बावजूद।
टूथब्रश

@ 1j01 कैसे के nameसाथ की जगह के बारे में (typeof name === "string")? name.replace(/\(|\)/,"") : "_noXSS" )? यदि यह एक तार है, तो यह कोष्ठक (निश्चित रूप से चर में अनुमत नहीं) को बदल देगा, इसलिए मुझे लगता है कि कुछ भी निष्पादित करना लगभग असंभव होगा।
रॉय जूली

2
खैर, फिर isValidVarName('aler(t')सच हो जाता है। और isValidVarName('_;;;')सच रहता है। लेकिन आप शुरुआत में जांच कर सकते हैं कि क्या यह कुछ इस तरह से मेल खाता है, /[;,\(\)]/लेकिन फिर भी आप इसे निष्पादित कर सकते हैं, _=location="#!?"इसलिए आप =सूची में जोड़ सकते हैं, लेकिन आप अभी भी निष्पादित कर सकते हैं '_\ndelete foo'(जो एक वैध चर नाम के रूप में परीक्षा पास करता है) इसलिए आपको \ns और \rs को बाहर करना पड़ सकता है और शायद कुछ यूनिकोड न्यूलाइन? लेकिन `$` एक वैध पहचानकर्ता नहीं है, इसलिए आपको सभी व्हाट्सएप को बाहर करना होगा ... यह एक हारी हुई लड़ाई है। मुझे लगता है कि जहां तक ​​मैं खुद के खिलाफ जा सकता हूंif(/[;,\(\)=\s]/.exec(name))return!1
1j01

1

यहाँ चर नाम बनाने के लिए एक त्वरित सुझाव दिया गया है। यदि आप चाहते हैं कि वैरिएबल फ़ायर्फ़ॉक्स में इस्तेमाल होने के दौरान वैरिएबल न हो, तो वैरिएबल नाम " _content " का उपयोग करें क्योंकि यह वैरिएबल नाम पहले से ही ब्राउज़र द्वारा उपयोग किया जा रहा है। मुझे यह कठिन तरीका लगा और मुझे उन सभी जगहों को बदलना पड़ा जहां मैंने एक बड़े जावास्क्रिप्ट एप्लिकेशन में "_content" चर का उपयोग किया था।


क्या आप कुछ स्रोत कोड के साथ इसे साबित कर सकते हैं जो विफल रहता है? यह फ़ायरफ़ॉक्स में कुछ भी करने के लिए प्रकट नहीं होता है।
टूथब्रश

यहाँ एक jsfiddle है जो चेतावनी देता है जब चर "_content" "अपरिभाषित" नहीं होता है और जब "_content" FireFox द्वारा सेट किया जाता है, तो इसे "window.content" jsfiddle.net/R2qvt/3
DanBrianWhite

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');
1

1
@ 1j01, Agh, मैं कोड टिप्पणी के बारे में भूल गया। मैं उम्मीद कर रहा था कि अकेले कोष्ठक के असंतुलित होने से कोड को चलने से रोका जा सकता है। के लिए एक साधारण जाँच को पहले ही छोड़ }देना चाहिए।
क्लोंग जूल

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

1

एक ग्लिच कार्यक्षेत्र लिखा जो सभी कोडपॉइंट्स पर पुनरावृत्त eval('var ' + String.fromCodePoint(#) + ' = 1')करता है और यदि काम करता है तो चरित्र का उत्सर्जन करता है।

यह बस चलता रहता है, और जा रहा है, और जा रहा है ...।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.