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?

Original source