आजकल, यहां दिए गए उत्तर पूरी तरह से पूरा/सही नहीं हैं।
ES5 से शुरू, शाब्दिक वाक्य रचना व्यवहार RegExp()
वाक्य रचना के बारे में वस्तु रचना के रूप में एक ही है: उन दोनों को एक नया RegExp ऑब्जेक्ट हर बार कोड पथ एक अभिव्यक्ति है जिसमें वे भाग ले रहे हैं हिट बनाता है।
इसलिए, उन दोनों के बीच फर्क सिर्फ इतना है अब कितनी बार है कि regexp संकलित किया गया है है:
शाब्दिक वाक्य रचना के साथ
- - एक बार प्रारंभिक कोड पार्सिंग के दौरान और संकलन
RegExp()
वाक्य रचना के साथ - हर बार नई वस्तु
देखें, उदाहरण के लिए, Stoyan Stefanov's JavaScript Patterns पुस्तक:
नियमित अभिव्यक्ति शाब्दिक और निर्माता के बीच एक और अंतर यह है कि शाब्दिक पार्स समय के दौरान केवल एक बार एक वस्तु बनाता है। यदि आप लूप में एक ही नियमित अभिव्यक्ति बनाते हैं, तो पहले निर्मित ऑब्जेक्ट को अपनी सभी गुणों के साथ वापस लौटा दिया जाएगा (जैसे अंतिम इंडेक्स) पहले से ही सेट हो चुका है। उदाहरण के लिए पर विचार करें कि एक ही ऑब्जेक्ट दो बार लौटाया गया है।
function getRE() {
var re = /[a-z]/;
re.foo = "bar";
return re;
}
var reg = getRE(),
re2 = getRE();
console.log(reg === re2); // true
reg.foo = "baz";
console.log(re2.foo); // "baz"
यह व्यवहार ES5 में बदल गया है और शाब्दिक भी नई वस्तुओं पैदा करता है। व्यवहार को कई ब्राउज़र वातावरण में भी ठीक किया गया है, इसलिए इस पर भरोसा नहीं किया जाना चाहिए।
आप सभी आधुनिक ब्राउज़रों या NodeJS में इस नमूने चलाते हैं, तो आप के बजाय निम्नलिखित मिलती है:
false
bar
कि मतलब ई बहुत बार जब आप getRE()
समारोह कॉल कर रहे हैं, एक नया RegExp
वस्तु शाब्दिक वाक्यविन्यास दृष्टिकोण के साथ भी बनाया गया है।
नहीं ऊपर केवल बताता है कि क्यों आप अपरिवर्तनीय regexps के लिए RegExp()
(यह बहुत अच्छी तरह से प्रदर्शन मुद्दा जाना जाता है आज) उपयोग नहीं करना चाहिए, लेकिन यह भी बताते हैं:
(मैं और अधिक आश्चर्य inlineRegExp और storedRegExp है कि कर रहा हूँ विभिन्न परिणाम)
storedRegExp
के बारे में 5 है -। inlineRegExp
से ब्राउज़रों में 20% प्रतिशत तेजी से बनाने (और कचरा एकत्र करने) एक नई RegExp
वस्तु पूर्व संध्या का कोई भूमि के ऊपर है, क्योंकि आरई समय
निष्कर्ष:
हमेशा शाब्दिक वाक्य रचना और यह कैश के साथ अपने अपरिवर्तनीय regexps बनाने इसे फिर से इस्तेमाल किया जा रहा है या नहीं।दूसरे शब्दों में, ईएस 5 के नीचे envs में व्यवहार में उस अंतर पर भरोसा न करें, और उपरोक्त envs में उचित कैशिंग जारी रखें।
शाब्दिक वाक्यविन्यास क्यों? यह कुछ निर्माता वाक्य रचना की तुलना में लाभ होता है:
- यह कम है और वर्ग की तरह कंस्ट्रक्टर्स के संदर्भ में सोचने के लिए आप के लिए मजबूर नहीं है।
RegExp()
कन्स्ट्रक्टर का उपयोग करते समय, आपको उद्धरण और डबल-एस्केप बैकस्लाश से बचने की भी आवश्यकता है। यह नियमित अभिव्यक्ति बनाता है जो उनकी प्रकृति को और भी कठिन बनाने के लिए कठिन और समझना कठिन होता है।
(एक ही Stoyan Stefanov's JavaScript Patterns किताब से नि: शुल्क प्रशस्ति पत्र)।
इसलिए, शाब्दिक वाक्यविन्यास के साथ रहना हमेशा अच्छा विचार है, जब तक कि आपका regexp संकलन समय पर ज्ञात न हो।
यह अच्छा है कि "इनलाइन" संस्करण तेज़ है, क्योंकि यह स्पष्ट कन्स्ट्रक्टर का उपयोग करने से बहुत कम बदसूरत है। – Pointy
एक के लिए, आपने 'RegExp' को अधिलेखित किया हो सकता है, इसलिए इसे ए) को सीधे मूल्यांकन करने के बजाय फ़ंक्शन को देखना होगा, और बी) दूसरे को पार्स टाइम पर मूल्यांकन किया जा सकता है जबकि पहला ऐसा नहीं कर सकता क्योंकि 'RegExp' को कॉल करना हो सकता है यदि आपने इसे अधिलेखित किया है तो साइड इफेक्ट्स। – pimvdb