在JavaScript中无法删除RegExp.$1

3

有人知道为什么RegExp.$1-x变量不能设置为undefined吗?

以下是在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:

请注意,这些属性已被弃用(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Deprecated_and_obsolete_features#RegExp_Properties)。请使用结果的字段(`test`)。 - Bergi
1个回答

5

Object.getOwnPropertyDescriptor(RegExp, "$1") 可以获取关于 $1 的信息:

Chrome 30:

{ 
    get: function, 
    set: function, 
    enumerable: true, 
    <b>configurable: false</b>
}

Firefox 22:

{
    <b>configurable: false,</b>
    enumerable: true, 
    value: "", 
    <b>writable: false</b>
}
请注意,configurablefalse,因此您无法删除属性。当writablefalse时,您也无法分配值。

configurable
仅当可以更改此属性描述符的类型并且可以从相应对象中删除该属性时,为true.

writable
仅当可以使用赋值运算符更改与该属性关联的值时,为true. 默认为false

因此,在Chrome和Firefox中,实现会防止您删除$1或使用=$1分配值。
作为比较,IE10报告有些不同...

Internet Explorer 10:

{
    value: "",
    <b>writable: true,</b>
    enumerable: false,
    <b>configurable: true</b>
}

话虽如此,IE10仍然不能让您删除该属性或为其分配值。谁知道呢。


如果缺少“writable”,并不意味着您不能对其进行赋值。它仍然可能具有一个“set”函数,只是我们不知道它的作用。 - Bergi
@Bergi 好的,我从_"默认为false"_这一点上理解过多了。 - canon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接