2012-01-18 13 views
16

इस कोड को देखते हुए:अलग परिणाम क्यों "जी" संशोधक देता है जब परीक्षण() दो बार कहा जाता है?

var reg = /a/g; 
console.log(reg.test("a")); 
console.log(reg.test("a")); 

मैं इस परिणाम मिलता है:

true 
false 

मैं पता नहीं यह कैसे हो सकता है। मैंने Node.js (v8) और फ़ायरफ़ॉक्स ब्राउज़र दोनों में परीक्षण किया है।

उत्तर

24

समस्या वैकल्पिक हल के लिए आप g झंडा हटाने या lastIndex

var reg = /a/g; 
console.log(reg.test("a")); 
reg.lastIndex = 0; 
console.log(reg.test("a")); 

में के रूप में समस्या पैदा होती है क्योंकि testexec जो पहले के बाद अधिक मिलान ढूंढता के आसपास आधारित है, तो एक ही स्ट्रिंग पारित कर दिया और रीसेट कर सकते हैं g ध्वज मौजूद है।

15.10.6.3RegExp.prototype.test(string) # Ⓣ Ⓡ

निम्नलिखित कदम उठाए जाते हैं:

  1. मैचका उपयोग कर इस RegExp वस्तु पर RegExp.prototype.exec (15.10.6.2) एल्गोरिथ्म के मूल्यांकन का परिणाम हो चलो तर्क के रूप में स्ट्रिंग
  2. यदि मैचnull नहीं है, तो true लौटाएं; अन्य false लौटें।

exec का महत्वपूर्ण हिस्सा 15.10.6.2 के चरण 6 है:

6. बुला का नतीजा हो वैश्विक चलो [[] जाओ] तर्क "वैश्विक" के साथ आर के आंतरिक विधि।
7. यदि वैश्विक गलत है, तो मैं = 0.

0 पर रीसेट नहीं किया जाता i करते हैं, तो exec (और इसलिए test) स्ट्रिंग की शुरुआत को देखकर शुरू नहीं करता है।

यह exec के लिए उपयोगी है क्योंकि आप पाश प्रत्येक मैच को संभालने के लिए कर सकते हैं:

var myRegex = /o/g; 
var myString = "fooo"; 
for (var match; match = myRegex.exec(myString);) { 
    alert(match + " at " + myRegex.lastIndex); 
} 

लेकिन स्पष्ट रूप से यह test के लिए बहुत उपयोगी नहीं है।

+0

जिसका अर्थ है कि मुझे अंतिम इंडेक्स को 0 पर सेट करना चाहिए, है ना? – NStal

+0

+1 अच्छा विवरण, मैं जानता था नहीं था। –

+0

@NStal, हाँ, की स्थापना '0 को परीक्षण से पहले lastIndex' समस्या वैकल्पिक हल होगा। –

2

आम तौर पर एक परीक्षण करता है, तो कुछ पैटर्न बिल्कुल मेल खाता है की जाँच करने के लिए चुना जाता है, लेकिन वैश्विक ध्वज एक स्ट्रिंग के माध्यम से पाश की सुविधा देता है या तो मैचों गिनती या, कार्यकारी की तरह, प्रत्येक lastIndex साथ कुछ करने के लिए। एक अन्य प्रयोग के lastIndex स्थापित करने के लिए है अपने आप को rx से पहले परीक्षण peformed है, कुछ चरित्र सूचकांक से पहले मैचों की अनदेखी करने के।

var count=0, rx=/\s+/g, rx.lastIndex=100; 
while(rx.test(string))count++; 
संबंधित मुद्दे