Difference between freeze and seal
ecmascript-5, javascript
Solution
`Object.seal`
- It prevents adding and/or removing properties from the sealed object; using `delete` will return false
- It makes every existing property non-configurable: they cannot be converted from 'data descriptors' to 'accessor descriptors' (and vice versa), and no attribute of accessor descriptors can be modified at all (whereas data descriptors can change their `writable` attribute, and their `value` attribute if `writeable` is true).
- Can throw a `TypeError` when attempting to modify the value of the sealed object itself (most commonly in strict mode)
`Object.freeze`
- Exactly what `Object.seal` does, plus:
- It prevents modifying any existing properties
Neither one affects 'deep'/grandchildren objects. E.g., if `obj` is frozen, `obj.el` can’t be reassigned, but the value of `obj.el` could be modified, e.g. `obj.el.id` can be changed.
Performance:
Sealing or freezing an object may affect its enumeration speed, depending on the browser:
- Firefox: enumeration performance is not impacted
- IE: enumeration performance impact is negligible
- Chrome: enumeration performance is faster with sealed or frozen objects
- Safari: sealed or frozen objects enumerate 92% slower (as of 2014)
Tests: Sealed objects, Frozen objects.
Problem
I just heard about the JavaScript methods `freeze` and `seal`, which can be used to make any Object immutable. Here's a short example how to use it: ``` var o1 = {}, o2 = {}; Object.freeze(o2); o1["a"] = "worked"; o2["a"] = "worked"; alert(o1["a"]); //prints "worked" alert(o2["a"]); //prints "undefined" ``` What is the difference between `freeze` and `seal`? Can they increase performance?