今日、私は非常に奇妙なJavaScriptの正規表現の問題を発見しました。グローバル修飾子(// g)を使用すると、RegExp.test()は後続の呼び出しで異なる値を返します。なぜ誰かが説明できますか?JavaScriptのRegExpが呼び出し間で状態を維持するのはなぜですか?
var s = "youtube.com/watch?v=XyeebVA3DNk";
var re1 = /^youtube\.com\/watch[a-zA-Z0-9_\-\?\&\=\/]+/g;
console.log(re1.test(s)); // true
console.log(re1.test(s)); // false
console.log(re1.test(s)); // true
console.log(re1.test(s)); // false
console.log(re1.test(s)); // true
console.log(re1.test(s)); // false
console.log(re1.test(s)); // true
var re2 = /^youtube\.com\/watch[a-zA-Z0-9_\-\?\&\=\/]+/;
console.log(re2.test(s)); // true
console.log(re2.test(s)); // true
console.log(re2.test(s)); // true
console.log(re2.test(s)); // true
console.log(re2.test(s)); // true
console.log(re2.test(s)); // true
これをChrome 8とFireFox 3.6で再現できます。