I looked into this and in all other cases we use an override of
delete for the following effects:
- Special case for Arrays since they store some of their properties
differently.
- Prevent deletion (though it would be better in most of these cases
to just rely on DontDelete attributes)/
- Cross-site scripting security checks on delete.
I think the Storage case would be more complicated than this,
because it dispatches an event and so can run arbitrary JavaScript
code. I think our JS interpreter is likely not prepared for "delete"
executing arbitrary JS code, and so may crash when this happens. We
can fix it, but I think delete having special behavior is not that
great from the point of design.
Comparing conciseness and familiarity:
storage.keyName
storage.getItem('keyName')
storage.keyName = 'value';
storage.setItem('keyName', 'value');
delete storage.keyName;
storage.removeItem('keyName');
The getter seems like the biggest relative increase in conciseness,
and the getter and setter will both be much more familiar with
operator syntax. But delete is fairly rarely used (and unlike
getters and setters does not allow overriding at the JS level in
many implementations) so the syntax is not much more familiar. The
improvement in conciseness is also less.
We should also keep in mind that overloading operators is kind of a
big deal and should not be done lightly. If the HTML5 spec required
custom behavior for * or && for certain objects rather than
following the JS rules I think we would all be pretty concerned.
So I'd rather avoid messing with the (relative) purity of the delete
operator.
I am a lot more swayed by this argument against adoption.
At this point, my concerns are not of a technical nature, but rather
of a "real life web" nature - either you force FFX and IE8 to remove
it, you have others adopt it, or the spec introduces a de facto
incompatibility on the web.
I have no solution, only this particular awareness of the problem.
~Brady
Regards,
Maciej