NodeList To Array3

Benchmark created by Makyen on


Preparation HTML

<div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<script>
  var nl = document.querySelectorAll('div,br');
    function asArray(obj) {
        //Accepts Arrays, array-like Objects (e.g. NodeLists), single elements, primitives.
        //  Returns an array, even if the array only has one entry.
        var newArr = [];
        if(typeof obj !== 'object' || obj instanceof Node) {
            return [obj];
        }
        if(Array.isArray(obj)){
            return obj;
        }
        if(obj === null) {
            return null;
        }
        if(typeof obj.length === 'number') {
            //NodeList and other array-like objects: faster in most browsers and
            //  more compatible than Array.from().
            newArr.push.apply(newArr, obj);
            return newArr;
        }
        if(typeof obj.nextNode === 'function') {
            //e.g. TreeWalkers, NodeIterator
            var currentNode;
            /* jshint -W084 */
            while(currentNode = nodeIter.nextNode()) {
                newArr.push(currentNode);
            }
            /* jshint +W084 */
            return newArr;
        }
        if(typeof Array.from === 'function') {
            return Array.from(obj);
        }
        //Indicate that we don't know what to do with the Object
        return null;
    }

</script>

Test runner

Ready to run.

Testing in
TestOps/sec
Array.prototype.slice.call
var arr = Array.prototype.slice.call(nl);
ready
[].slice.call()
var arr = [].slice.call(nl);
ready
push
var arr = [];
for (var i = 0, n; n = nl[i]; ++i) arr.push(n);
ready
push.apply
var arr = [];
arr.push.apply(arr, nl);
ready
Array.from
var arr = Array.from(nl);
ready
Spread syntax
var arr = [...nl];
ready
set length first
var arr = [];
for (var i = 0, ref = arr.length = nl.length; i < ref; i++) {
 arr[i] = nl[i];
}
ready
set length first 2
var l = nl.length;
var arr = new Array(l);
for (var i = 0; i < l; i++) {
 arr[i] = nl[i];
}
ready
ignore length
var l = nl.length;
var arr = [];
for (var i = 0; i < l; i++) {
 arr[i] = nl[i];
}
ready
Terse While new Array
var l=nl.length, arr = new Array(l);
while(l--){arr[l]=nl[l]};
ready
asArray
var arr = asArray(nl);
ready
Bitwise operation
var arr = [];
for (var i=0, l=nl.length >>> 0; i++ !==l; arr[i] = nl[i]);
ready

Revisions

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