freeze vs seal vs preventExtensions vs pseudo-freeze vs normal (v12)

Revision 12 of this benchmark created on


Preparation HTML

<script>

var o = {
    i: 42,
    s: 3,
    n: 5,
    r: 7,
    a: [1, 2, 3],
    f: function (i) {
        return i;
    }
};
var f = {
    i: 42,
    s: 3,
    n: 5,
    r: 7,
    a: [1, 2, 3],
    f: function (i) {
        return i;
    }
};
var s = {
    i: 42,
    s: 3,
    n: 5,
    r: 7,
    a: [1, 2, 3],
    f: function (i) {
        return i;
    }
};

var pe = {
    i: 42,
    s: 3,
    n: 5,
    r: 7,
    a: [1, 2, 3],
    f: function (i) {
        return i;
    }
};

Object.seal(s);
Object.freeze(f);
Object.preventExtensions(pe);

function deepFreeze(o) {
    Object.freeze(o); // First freeze the object.
    for (var propKey in o) {
        var prop = o[propKey];
        if (o.hasOwnProperty(propKey) && prop instanceof Object && !Object.isFrozen(prop)) {
            deepFreeze(prop); // Recursively call deepFreeze.
        }
    }
}

var df = {
    i: 42,
    s: 3,
    n: 5,
    r: 7,
    a: [1, 2, 3],
    f: function (i) {
        return i;
    }
};

deepFreeze(df);

function pseudoFreeze(obj) {
    Object.preventExtensions(obj);
    Object.keys(obj).forEach(function (key) {
        var descriptor = Object.getOwnPropertyDescriptor(obj, key);
        descriptor.writable = false;
        descriptor.configurable = false;
        Object.defineProperty(obj, key, descriptor);
    });
}

var pf = {
    i: 42,
    s: 3,
    n: 5,
    r: 7,
    a: [1, 2, 3],
    f: function (i) {
        return i;
    }
};

pseudoFreeze(pf);

</script>

Test runner

Ready to run.

Testing in
TestOps/sec
seal
var p = s.i + s.s + s.n + s.r;
s.f(p);
ready
normal
var r = o.i + o.s + o.n + o.r;
o.f(r);
ready
freeze
var q = f.i + f.s + f.n + f.r;
f.f(q);
ready
deeply frozen
var q = df.i + df.s + df.n + df.r;
df.f(q);
ready
preventExtensions
var q = pe.i + pe.s + pe.n + pe.r;
pe.f(q);
ready
pseudo-freeze
var q = pf.i + pf.s + pf.n + pf.r;
pf.f(q);
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.