Javascript: The Good Parts by Douglas Crockford で、JavaScript の正規表現リテラルが同じオブジェクトを共有することを読みました。もしそうなら、なぜこれら 2 つの正規表現リテラルのlastIndex
プロパティが異なるのでしょうか?
var a = /a/g;
var b = /a/g;
a.lastIndex = 3;
document.write(b.lastIndex);
3 ではなく 0 が出力されます。
Javascript: The Good Parts by Douglas Crockford で、JavaScript の正規表現リテラルが同じオブジェクトを共有することを読みました。もしそうなら、なぜこれら 2 つの正規表現リテラルのlastIndex
プロパティが異なるのでしょうか?
var a = /a/g;
var b = /a/g;
a.lastIndex = 3;
document.write(b.lastIndex);
3 ではなく 0 が出力されます。
ECMAScript ドキュメントのセクション 7.8.5 では、これらが 2 つの異なるオブジェクトであることを明確にしています。
7.8.5 正規表現リテラル
正規表現リテラルは、リテラルが評価されるたびに RegExp オブジェクト (15.10 を参照) に変換される入力要素です。プログラム内の 2 つの正規表現リテラルは、たとえ 2 つのリテラルの内容が同一であっても、互いに === として比較されることのない正規表現オブジェクトに評価されます。RegExp オブジェクトは、新しい RegExp (15.10.4 を参照) または RegExp コンストラクターを関数として呼び出す (15.10.3) ことによって、実行時に作成することもできます。
それらは異なるオブジェクトだからです。
document.write(a === b);
これでも が出力されますfalse
。
クロックフォードが間違っていたか、当時は正しかったのに時代が変わったかのどちらかです。
これは特に役立つ回答でも有益な回答でもないことを認識しています。私は、クロックフォードが書いた何かが(今では)間違っている可能性があるというあなたの不信として私が認識していることを押し戻している.
ところで、その主張への言及はありますか? 文脈で読むと面白いでしょう(私は本を持っていません)。