最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Are regex Literals always RegExp Objects? - Stack Overflow

programmeradmin2浏览0评论

Basically, my question is about how Javascript handles regex literals.

Contrasting with number, string and boolean where literals are primitive data types and corresponding Number, String and Boolean objects exist with seamless type conversion, are regex literals anonymous instances of the RegExp object or is this a case of regex being treated like primitive data with seamless type conversion to RegExp?

"The complete Reference Javascript, 2nd edition, Powell and Schneider (MH)" contradicts itself - at one place the authors say that /regex/ is automatically typecasted into RegExp when needed and at another place they say that /regex/ is nothing but an instance of RegExp!

EDIT: Please provide a reference to a reliable source

Basically, my question is about how Javascript handles regex literals.

Contrasting with number, string and boolean where literals are primitive data types and corresponding Number, String and Boolean objects exist with seamless type conversion, are regex literals anonymous instances of the RegExp object or is this a case of regex being treated like primitive data with seamless type conversion to RegExp?

"The complete Reference Javascript, 2nd edition, Powell and Schneider (MH)" contradicts itself - at one place the authors say that /regex/ is automatically typecasted into RegExp when needed and at another place they say that /regex/ is nothing but an instance of RegExp!

EDIT: Please provide a reference to a reliable source

Share Improve this question edited Aug 25, 2009 at 6:33 KJ Saxena asked Aug 25, 2009 at 6:24 KJ SaxenaKJ Saxena 21.8k24 gold badges84 silver badges111 bronze badges
Add a comment  | 

3 Answers 3

Reset to default 14

Here's what the spec has to say:

A regular expression literal is an input element that is converted to a RegExp object when it is scanned. The object is created before evaluation of the containing program or function begins. Evaluation of the literal produces a reference to that object; it does not create a new object. Two regular expression literals in a program evaluate to regular expression objects that never compare as === to each other even if the two literals' contents are identical.

There is no primitive regex type that autoboxes to an object in the same way as string or number.

Note, however, that not all browsers implement the "instantiate-once-per-literal" behavior, including Safari and IE6 (and possibly later), so portable code shouldn't depend on it. The abortive ECMAScript 4 draft would have changed the behavior to match those browsers:

In ES3 a regular expression literal like /a*b/mg denotes a single unique RegExp object that is created the first time the literal is encountered during evaluation. In ES4 a new RegExp object is created every time the literal is encountered during evaluation.

Also, some browsers (Firefox <3, Safari) report typeof /regex/ as "function", so portable code should avoid typeof on RegExp instances—stick with instanceof.

Yes, the following two expressions are equivalent:

var r1 = /ab+c/i,
    r2 =new RegExp("ab+c", "i");

The constructor property of both points to the RegExp constructor function:

(/ab+c/i).constructor === RegExp // true
r2.constructor === RegExp // true

And a regexp literal is an instance of RegExp:

 /ab+c/i instanceof RegExp // true

The basic difference is that defining regular expressions using the constructor function allows you to build and compile an expression from a string. This can be very useful for constructing complex expressions that will be re-used.

Yes, new RegExp("something", "g") is the same as /something/g

发布评论

评论列表(0)

  1. 暂无评论