javascript - typeof สำหรับ RegExp
มีวิธีใดที่จะตรวจสอบได้ไหมว่าออบเจ็กต์ JavaScript เป็น regex หรือไม่?
ตัวอย่างเช่น ฉันอยากทำอะไรบางอย่างแบบนี้:
var t = /^foo(bar)?$/i;
alert(typeof t); //I want this to return "regexp"
นี่เป็นไปได้หรือไม่?
ขอบคุณ!
แก้ไข: ขอบคุณสำหรับคำตอบทั้งหมด ดูเหมือนว่าฉันมีตัวเลือกที่ดีมากสองตัวเลือก:
obj.constructor.name === "RegExp"
หรือ
obj instanceof RegExp
มีข้อดีข้อเสียหลักๆ ของวิธีใดวิธีหนึ่งไหม?
ขอบคุณอีกครั้ง!
คำตอบ #1
คุณสามารถใช้ตัวดำเนินการ instanceof ได้:
var t = /^foo(bar)?$/i;
alert(t instanceof RegExp);//returns true
ในความเป็นจริง นั่นแทบจะเหมือนกับ:
var t = /^foo(bar)?$/i;
alert(t.constructor == RegExp);//returns true
โปรดจำไว้ว่าเนื่องจาก RegExp ไม่ใช่ประเภทข้อมูลดั้งเดิม จึงไม่สามารถใช้ตัวดำเนินการ typeof ซึ่งอาจเป็นตัวเลือกที่ดีที่สุดสำหรับคำถามนี้ได้
แต่คุณสามารถใช้เทคนิคนี้ข้างต้นหรือวิธีอื่น ๆ เช่น การตรวจสอบประเภทเป็ด ตัวอย่างเช่น การตรวจสอบว่าวัตถุนั้นมีเมธอดหรือคุณสมบัติที่สำคัญใด ๆ หรือโดย ค่าคลาสภายใน ของมัน (โดยใช้ {}.toString.call(instaceOfMyObject))
คำตอบ #2
alert( Object.prototype.toString.call( t ) ); // [object RegExp]
นี่คือวิธีที่กล่าวถึงในข้อกำหนดสำหรับการดึงคลาสของวัตถุ
จาก ECMAScript 5, มาตรา 8.6.2 คุณสมบัติและวิธีการภายในของวัตถุ:
ค่าของคุณสมบัติภายใน [[Class]] ถูกกำหนดโดยข้อกำหนดนี้สำหรับวัตถุในตัวทุกประเภท ค่าของคุณสมบัติภายใน [[Class]] ของวัตถุโฮสต์อาจเป็นค่าของสตริงใดก็ได้ ยกเว้นหนึ่งใน "Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON", "Math", "Number", "Object", "RegExp", และ "String" ค่าของคุณสมบัติ [[Class]] ภายในถูกใช้ภายในเพื่อแยกแยะประเภทของวัตถุต่าง ๆ โปรดทราบว่าข้อกำหนดนี้ไม่ได้ให้วิธีใด ๆ สำหรับโปรแกรมในการเข้าถึงค่านั้น นอกจากผ่าน Object.prototype.toString (ดู 15.2.4.2)
RegExp เป็นคลาสของวัตถุที่ถูกนิยามในสเปกที่ Section 15.10 RegExp(RegularExpression)Objects:
วัตถุ RegExp ประกอบด้วยนิพจน์ทั่วไปและแฟลกที่เกี่ยวข้อง
คำตอบ #3
ลองใช้คุณสมบัติ .constructor:
> /^foo(bar)?$/i.constructor
function RegExp() { [native code] }
> /^foo(bar)?$/i.constructor.name
"RegExp"
> /^foo(bar)?$/i.constructor == RegExp
true
คำตอบ #4
จาก underscore.js
// Is the given value a regular expression?
_.isRegExp = function(obj) {
return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false));
};
