>>> var par = {a: 1, b: 2};
undefined
>>> var ch = Object.create(par);
undefined
>>> delete ch.a
true
>>> ch
Object { a=1, b=2}
Asked
Active
Viewed 2,140 times
3

Brian Tompsett - 汤莱恩
- 5,753
- 72
- 57
- 129

Andrew
- 36,676
- 11
- 141
- 113
-
Try deleting `par.a`, it returns true and actually deletes the property, but it also deletes `ch.a`. Why? Because using `Object.create` you just create a reference to the object, not a new copy. Here is a very good article about `delete`: http://perfectionkills.com/understanding-delete/ -- you can read the behaviour of `Object.create` from [here - MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create) – Niccolò Campolungo Sep 07 '13 at 17:44
-
And I think this can help you http://stackoverflow.com/questions/728360/most-elegant-way-to-clone-a-javascript-object – Niccolò Campolungo Sep 07 '13 at 17:53
1 Answers
4
You misunderstood what delete returns:
Throws in strict mode if the property is an own non-configurable property (returns false in non-strict). Returns true in all other cases. (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete)
delete ch.a
tries to locate the property a
in ch
, fails (since ch
doesn't have such own property), does nothing and happily returns true
. If you wrote delete ch.foobar
, the result would be the same. If however, you tried a non-configurable property (e.g. delete ch.__proto__
), the result would be false
.

georg
- 211,518
- 52
- 313
- 390
-
I think ch has property ch.a (1) and in this case it is inhereted, and I know it. But I just expect if I don't know if property is inhereted to get false if it didn't deleted. – Andrew Sep 07 '13 at 18:12
-
2@ruan65: `delete` only returns `false` if you're not _allowed_ to delete a property, and `true` in all other cases - no matter if a property was actually deleted or not. – georg Sep 07 '13 at 20:36
-
-
1this was poor implementation/specification - it should THROW if you are not allowed to delete the property, return false, if the property does not exist, and return true if the property exists. To be even more precise, in strict mode, it should throw if it's non-configurable, o/w return false if it's non-configurable. – Alexander Mills May 26 '18 at 21:07