2012-06-14 21 views
10

आप के बाद से में एक regexp स्टोर कर सकते हैं एक चरदो regexps की तुलना कैसे करें?

var regexp = /a/; 

क्यों

console.log(/a/ == /a/); 

और यहां तक ​​कि

var regexp1 = /a/; 
var regexp2 = /a/; 
console.log(regexp1 == regexp2); 

दोनों लौट false करते हैं?

उत्तर

19

इस प्रयास करें:

String(regexp1) === String(regexp2)) 

आप गलत हो रही है उन दो विभिन्न वस्तुओं रहे हैं, क्योंकि।

7

"समस्या":

regex एक object है - एक संदर्भ प्रकार, तो comparsion संदर्भ द्वारा किया जाता है, और उन दो विभिन्न वस्तुओं रहे हैं।

console.log(typeof /a/); // "object" 

दोनों ऑपरेंड वस्तुओं रहे हैं, तो जावास्क्रिप्ट आंतरिक संदर्भ जो बराबर हैं जब ऑपरेंड स्मृति में एक ही वस्तु का उल्लेख है।

MDN

समाधान:

​var a = /a/; 
var b = /a/; 
console.log(​​​a.toString() === b.toString()); // true! yessss! 

Live DEMO

एक और "हैक" regex तों पर toString() मजबूर करने के लिए है:

console.log(a + "" === b + "");​ 
3

बस एक अनुमान है - लेकिन जावास्क्रिप्ट आपके रेगेक्स के लिए RegExp ऑब्जेक्ट नहीं बनाता है, और इसलिए क्योंकि आपने दो अलग-अलग ऑब्जेक्ट बनाए हैं (भले ही उनके पास "मान" है) वे वास्तव में अलग हैं?

+0

यह अनुमान नहीं है, यह सही जवाब है ... +1 – gdoron

2

int, स्ट्रिंग, बूलियन जावास्क्रिप्ट जैसे प्राचीन डेटा प्रकारों के लिए तुलना करने के लिए क्या पता है, लेकिन तारीख या रेगेक्स जैसी ऑब्जेक्ट्स के लिए ऑपरेटर केवल स्मृति में जगह को देखता है, क्योंकि आप अपने रेगेक्स को स्वतंत्र रूप से परिभाषित करते हैं, उनके पास स्मृति में दो अलग-अलग स्थान होते हैं इसलिए वे बराबर नहीं हैं।

संबंधित मुद्दे