Type Cecking (v2)

Revision 2 of this benchmark created by L8D on


Description

A comparison of the type checking in http://techblog.badoo.com/blog/2013/11/01/type-checking-in-javascript/ , manual type checking, and having no type checking.

Preparation HTML

<script>
var arr = [];
for(var i = 0; i <= 30000; i++) arr.push(i);

(function (root) {
 
    var type = function (o) {
 
        // handle null in old IE
        if (o === null) {
            return 'null';
        }
 
        // handle DOM elements
        if (o && (o.nodeType === 1 || o.nodeType === 9)) {
            return 'element';
        }
 
        var s = Object.prototype.toString.call(o);
        var type = s.match(/\[object (.*?)\]/)[1].toLowerCase();
 
        // handle NaN and Infinity
        if (type === 'number') {
            if (isNaN(o)) {
                return 'nan';
            }
            if (!isFinite(o)) {
                return 'infinity';
            }
        }
 
        return type;
    };
 
    var types = [
        'Null',
        'Undefined',
        'Object',
        'Array',
        'String',
        'Number',
        'Boolean',
        'Function',
        'RegExp',
        'Element',
        'NaN',
        'Infinite'
    ];
 
    var generateMethod = function (t) {
        type['is' + t] = function (o) {
            return type(o) === t.toLowerCase();
        };
    };
 
    for (var i = 0; i < types.length; i++) {
        generateMethod(types[i]);
    }
 
    if (typeof exports === "object" && exports) {
        exports = type;
    }
    else if (typeof define === "function" && define.amd) {
        define(type);
    }
    else {
        root.type = type;
    }
 
})(this);
</script>

Setup

var result = [];

Test runner

Ready to run.

Testing in
TestOps/sec
type function check
for (var i = 0, l = arr.length; i < l; i++) {
  if (!type.isNumber(arr[i])) throw TypeError();
}
ready
typeof manual check
for (var i = 0, l = arr.length; i < l; i++) {
  if (typeof arr[i] !== 'number' || isNaN(arr[i])) throw TypeError();
}
ready
no type check
for (var i = 0, l = arr.length; i < l; i++) continue;
ready
type function filter
var narr = arr.filter(type.isNumber);

if (narr.length < arr.length) throw TypeError();

for (var i = 0, l = narr.length; i < l; i++) continue;
ready
typeof manual filter
var narr = arr.filter(function(n) {
  return typeof n === 'number' && !isNaN(n);
});

if (narr.length < arr.length) throw TypeError();

for (var i = 0, l = narr.length; i < l; i++) continue;
ready

Revisions

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