3

任何人都知道为什么 RegExp.$1-x 变量不能设置为未定义?

以下是 nodejs 中的示例。chrome/firefox 中的相同行为:

console.log('1:', RegExp.$1, RegExp.$2, RegExp.$3, RegExp.$4); 
// 1: / Users/tiefenma/Desktop/ test.js .js

var string = 'test1 test2 test3';
var test = string.match(/(test1).*(test2).*(test3)/gm);


console.log('2:', RegExp.$1, RegExp.$2, RegExp.$3, RegExp.$4);
// 2: test1, test2, test3


RegExp.$1 = undefined;
RegExp.$2 = undefined;
RegExp.$3 = undefined;
console.log('3:', RegExp.$1, RegExp.$2, RegExp.$3, RegExp.$4);
// 3: test1, test2, test3


delete RegExp.$1;
delete RegExp.$2;
delete RegExp.$3;
console.log('4:', RegExp.$1, RegExp.$2, RegExp.$3, RegExp.$4);
// 4: test1, test2, test3


''.match(/(.*)/g);
console.log('5:', RegExp.$1, RegExp.$2, RegExp.$3, RegExp.$4);
// 5:
4

1 回答 1

5

Object.getOwnPropertyDescriptor(RegExp, "$1")将为您提供以下信息$1

铬 30:

{ 
    get: function, 
    set: function, 
    enumerable: true, 
    configurable: false
}

火狐 22:

{
    configurable: false,
    enumerable: true, 
    value: "", 
    writable: false
}

注意configurablefalse; 因此,您无法删除该属性。此外,当writableis时false,您无法分配值。


当且仅当可以更改此属性描述符的类型并且可以从相应对象中删除该属性时,才可配置为 true。 当且仅当与属性关联的值可以使用赋值运算符更改时,

可写为真。默认为.
false

因此,在 Chrome 和 Firefox 中,实现会阻止您删除或为with$1赋值。$1=

作为一个比较点,IE10 报告的事情有点不同......

互联网浏览器 10:

{
    value: "",
    writable: true,
    enumerable: false,
    configurable: true
}

也就是说,IE10 仍然不允许您删除该属性或为其赋值。去搞清楚。

于 2013-08-01T13:21:33.420 回答