Google Chrome 6 は (typeof /foo/ === 'function') となる

Google Chrome 6 は (typeof /foo/ === 'function') となり、Firefox v3.6.6, Opera v10.62, IE8 は (typeof /foo/ === 'object') となります。 typeof演算子は [[Call]] プロパティの有無で "function", "object" を判定します。
1
think49 @think49

Google Chrome 6 は alert(typeof /foo/); または alert(typeof new RegExp('foo')); で "function" を返す。 Chrome のバグ…? http://goo.gl/Acc5 #GoogleChrome

2010-09-29 17:57:54
小倉唯 @Constellation

@think49 ES5thでは[[Call]]を実装しているものにはtypeofで"function"を返すようにとされているので正しいですー http://bit.ly/9RWwjj http://bit.ly/af5FoA

2010-09-29 18:25:42
think49 @think49

@Constellation @uupaa ありがとうございます。 ES3仕様では new RegExp が [[Call]] を実装していないように読めたので変だと思っていました。ES5 の仕様を読んでみます。

2010-09-29 18:40:40
小倉唯 @Constellation

@think49 仕様上は[[Call]]実装を規定していませんが, /test/("test")が動くように各々engineがRegExpに[[Call]]実装しちゃってるので, typeofの[[Call]]を持ってたら理論に従うと"function"になっちゃう感じですー.

2010-09-29 18:43:23
think49 @think49

@Constellation なるほど、理解しました。 Google Chrome は new RegExp に対して、ES5 規定にない [[Call]] を実装しているので "function" を返すのですね。

2010-09-29 18:58:14
think49 @think49

Firefox, Opera も RegExp で [[Call]] を実装しているが、ES5 規定には存在しないはずなので、便宜上 "object" を返す、と。

2010-09-29 18:59:13
think49 @think49

IE8 は /foo/(); で「関数を指定してください。」を返すことから、[[Call]] を実装していないようですね。 typeof /foo/ === 'object' で true が返ってきました。

2010-09-29 19:12:59
think49 @think49

http://goo.gl/cP6J (意訳) RegExp のインスタンスが関数として呼び出されたとき、exec() が呼び出されたかのように振る舞う。/ なぜか日本語版MDCにはこの記述がなく、英語版だけに存在する。 #MDC

2010-09-29 20:35:42
think49 @think49

従って、/(a)bc/.exec('abc'); と /(a)bc/('abc'); は等価となる。 IE8 がサポートしない独自拡張なことから、あえて使う理由は見いだせない。 ブラウザを限定して良い状況におけるショートコーディング向けかな。

2010-09-29 20:40:31
小倉唯 @Constellation

typeof / / === 'function' は, runtime.ccの4202行目. Runtime_Typeofがasmからcallされてる. あー, Callableとかじゃなくて特別扱いしてるのね(JS_REGEXP_TYPE)

2010-09-29 21:05:53
think49 @think49

ideone.com にまとめてみました。 http://ideone.com/3gk8R rhino も (typeof /foo/ === 'function') のようです。

2010-09-29 21:09:53
小倉唯 @Constellation

へー, v8のRegExp[[Call]], もともとJSCとの互換性のために実装されてたんだなー.

2010-10-02 08:24:46
小倉唯 @Constellation

[[Call]], RegExpのやつ, なんかV8とかSpiderMonkeyとかのを見てると, deprecated扱いっぽい流れになってるから/ing$/("working")とかしない方がよさそう.

2010-10-14 22:23:11