Cannot Delete RegExp.$1 in JavaScript


Anyone know why are the RegExp.$1-x variables are not settable to undefined?

Following example in nodejs. Same behavior in 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

console.log('5:', RegExp.$1, RegExp.$2, RegExp.$3, RegExp.$4);
// 5:
Problem courtesy of: tiefenb


Object.getOwnPropertyDescriptor(RegExp, "$1") will give you information about $1:

Chrome 30:

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

Firefox 22:

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

Note that configurable is false; so, you can't delete the property. Also, when writable is false, you can't assign a value.

true if and only if the type of this property descriptor may be changed and if the property may be deleted from the corresponding object.

True if and only if the value associated with the property may be changed with an assignment operator. Defaults to false.

So, in Chrome and Firefox, the implementation prevents you from deleting $1 or assigning a value to $1 with =.

As a point of comparison, IE10 reports things a little differently...

Internet Explorer 10:

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

That said, IE10 still won't let you delete the property or assign a value to it. Go figure.

Solution courtesy of: canon


There is currently no discussion for this recipe.

This recipe can be found in it's original form on Stack Over Flow.