ค้นหาเว็บไซต์

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));
  };

บทความที่เกี่ยวข้อง