javascript atscript क्या इनलाइन जावास्क्रिप्ट सामान्य अभिव्यक्तियाँ तेजी से हैं?




स्क्रिप्टिंग भाषा (3)

क्या यह RegExp ऑब्जेक्ट या इनलाइन शैली का उपयोग करना बेहतर है? और क्यों?


जेपी के उत्तर के मुताबिक कुछ मामूली अंतर है, जो कभी-कभी महत्वपूर्ण हो सकता है। इरादा यह था कि:

var re = /\d+/;

जैसे ही हो:

var re = new RegExp("\\d+");

लेकिन, अजीब तरह से, फ़ायरफ़ॉक्स / क्रोम में यह बिल्कुल वैसा ही नहीं है (जैसा कि उनके उदाहरण द्वारा कई बार उपयोग किया गया है)।

तो, RegExp ऑब्जेक्ट का उपयोग मेरी सलाह होगी और जेपी द्वारा एक उत्कृष्ट खोज

कहा जा रहा है कि, प्रमुख परिस्थिति में जहां आपको शाब्दिक वाक्यविन्यास पर RegExp का उपयोग करना था वैसे भी गतिशील रूप से अभिव्यक्ति बनाने के लिए था, उदाहरण के लिए:

var s = "[asdf]+";
var re = new RegExp(":" + s + ":", "g");

"RegExp () विधि आपको डायनामिक रूप से खोज पैटर्न को एक स्ट्रिंग के रूप में बनाने की अनुमति देता है, और यह तब उपयोगी होता है जब पैटर्न समय से पहले नहीं जाना जाता है।" - http://www.javascriptkit.com/jsref/regexp.shtml


ईएस 3 विनिर्देश के मुताबिक, ये थोड़ा अलग है कि प्रारंभिक स्कैन पर एक शाब्दिक वाक्यविन्यास ( /regex/ ) एकल RegExp ऑब्जेक्ट पैदा करेगा:

एक नियमित अभिव्यक्ति शब्दशः एक इनपुट तत्व होता है जिसे एक RegExp ऑब्जेक्ट (खंड 15.10) में परिवर्तित किया जाता है, जब इसे स्कैन किया जाता है। वस्तु को उस कार्यक्रम के मूल्यांकन से पहले बनाया जाता है जो कि कार्यक्रम या समारोह शुरू होता है। शाब्दिक का मूल्यांकन उस वस्तु के संदर्भ बनाता है; यह एक नया ऑब्जेक्ट नहीं बना रहा है

उस नमूने में त्रुटि को ईएस 4 में स्वीकार किया गया था:

ईएस 3 में एक नियमित अभिव्यक्ति शब्दशः जैसे / ab / mg एक एकल अनन्य RegExp ऑब्जेक्ट को दर्शाता है जो मूल्यांकन के दौरान पहली बार शाब्दिक उत्पन्न होता है। ईएस 4 में एक नई RegExp ऑब्जेक्ट हर बार बनाई जाती है, जब मूल्यांकन के दौरान शाब्दिक का सामना होता है।

कार्यान्वयन ब्राउज़र में अलग-अलग होता है सफारी और आईएसई ईएस 4 के मुताबिक लिटरेल्स का प्रबंधन करते हैं, लेकिन फ़ायरफ़ॉक्स और क्रोम ईएस 3 के अनुसार उनका इलाज करते हैं।

विभिन्न ब्राउज़रों में निम्न कोड आज़माएं और आप देखेंगे कि मेरा क्या मतलब है:

function f() {
    return /abc/g.test('abc');
}

alert(f()); // Alerts true
alert(f()); // Alerts false in FF/Chrome

के साथ तुलना:

function f() {
    return RegExp('abc', 'g').test('abc');
}

alert(f()); // Alerts true
alert(f()); // Alerts true

ध्यान दें, झूठे सतर्क हो जाता है क्योंकि फ़ंक्शन अभी भी उस फ़ंक्शन के पिछले कॉल से regex का उपयोग कर रहा है, जिसकी पिछली प्रस्तुति अपडेट की गई थी, जिसका अर्थ है कि यह अब "abc" स्ट्रिंग से मेल नहीं खाएगा।

टिप: RegExp को तत्काल होने के लिए new ऑपरेटर की आवश्यकता नहीं है। RegExp() स्वयं द्वारा एक ही काम करता है ...

ईएस 3/4 अंक पर अधिक जानकारी: रेगेक्स / पिछले इंडेक्स - अनपेक्षित व्यवहार







browser