为什么我的 Javascript 中的两个正则表达式文本在一个属性上有所不同

Why do two regex literals in my Javascript vary on a property?

本文关键字:一个 属性 有所不同 文本 正则表达式 Javascript 我的 两个 为什么      更新时间:2023-09-26

我在 Douglas Crockford 的 Javascript: The Good Parts 中读到,javascript 正则表达式文字共享同一个对象。如果是这样,那么为什么这两个正则表达式文本在lastIndex属性中有所不同?

var a = /a/g;
var b = /a/g;
a.lastIndex = 3;
document.write(b.lastIndex);​

JS小提琴

输出 0 而不是 3。

ECMAScript 文档的第 7.8.5 节非常清楚地表明它们是两个不同的对象:

7.8.5 正则表达式文字
正则表达式文本是每次计算文本时转换为 RegExp 对象的输入元素(请参阅 15.10)。程序中的两个正则表达式文本的计算结果为正则表达式对象,即使两个文本的内容相同,这些对象也不会相互比较为 ===。RegExp 对象也可以在运行时由新的 RegExp(参见 15.10.4)或调用 RegExp 构造函数作为函数 (15.10.3) 创建。

因为它们是不同的对象。

document.write(a === b);

即使这样输出false.

要么克罗克福德错了,要么他当时是对的,但时代变了。

我意识到这不是一个特别有用或信息丰富的答案;我只是在反驳我认为你不相信克罗克福德写的东西可能是(现在)错误的。

顺便问一下,你有关于这种说法的参考吗?在上下文中阅读它会很有趣(我没有这本书)。