In this post I will describe in
and delete
JavaScript operators.
Operator in
can be used to check if given object has given property:
var obj = {
propA: 'xxx',
propB: { someData: 101 }
};
console.log('propA' in obj); // true
console.log('notExisting' in obj); // false
obj.notExisting = 'xxx';
console.log('notExisting' in obj); // true
var propName = 'propA';
console.log(propName in obj); // true
While checking if object has given property in
also checks
prototype chain:
var proto = {
propA: 'xxx'
};
var obj = Object.create(proto);
obj.propB = 'yyy';
console.log('toString' in obj); // true - from Object
console.log('propA' in obj); // true - from proto
console.log('propB' in obj); // true - own property
Adding properties to objects in JavaScript is easy, what’s about removing?
var obj = { };
obj.prop = 1;
// attempt to remove prop
obj.prop = undefined;
// assigning undefined to property doesn't remove it
console.log('prop' in obj); // true
console.log(Object.keys(obj)); // ["prop"]
delete obj.prop;
// or delete obj['prop'];
// now property is gone
console.log('prop' in obj); // false
console.log(Object.keys(obj)); // []
But we cannot delete anything from prototype chain:
var proto = { prop: 1 };
var obj = Object.create(proto);
console.log('prop' in obj); // true
console.log(Object.keys(obj)); // []
delete obj.prop;
// nothing changed
console.log('prop' in obj); // true
console.log(Object.keys(obj)); // []
Also in strict mode we cannot delete global functions and variables
but we can delete properties of window
object:
function globalFunc() { }
var globalVar = 1;
window.globalViaProp = 1;
(function () {
'use strict';
// "SyntaxError: Delete of an unqualified identifier in strict mode.
// delete globalFunc;
// delete globalVar;
// delete globalViaProp;
// "TypeError: Cannot delete property 'globalVar' of #<Window>
// delete window.globalVar;
// delete window.globalFunc;
delete window.globalViaProp; // ok
})();
As usual with JavaScript without strict mode you won’t get any of these errors.
And what if you want to make one of your own properties undeletable?
No problem just mark is as a non configurable prop:
(function () {
'use strict';
var obj = {};
Object.defineProperty(obj, 'nonDeletable', {
value: 'foo forever',
writable: false,
configurable: false, // cannot be deleted
enumerable: true
});
console.log(obj.nonDeletable);
// strict mode again:
// "TypeError: Cannot delete property 'nonDeletable'
// delete obj.nonDeletable;
})();
The last thing about delete
to remember is that it returns true
when it manages to remove property and false
otherwise.
If you think that this may be useful, look at the example below:
var proto = { foo: 1};
var obj = Object.create(proto);
// property was not removed but we get true
console.log(delete obj.foo); // true
console.log(obj.foo); // 1
// property didn't exist but we get true again
console.log(delete obj.bar); // true
console.log(obj.bar); // undefined
OK OK to be honest delete
returns true
when object
doesn’t have own property after executing delete operation.
In other words if delete
returns true
we may be certain
that property name doesn’t appear
in array returned by Object.keys()
.
The End