A NodeList has a length and numeric indices, which is enough to make it look like an array until the first time you call map or filter on it and get a TypeError.
var nodes = document.querySelectorAll('.row');
nodes.forEach(fn); // works in some browsers, not all
nodes.map(fn); // TypeError everywhere
Array.prototype.slice.call(nodes).map(fn); // reliable today
There is a second trap: the NodeList from querySelectorAll is static, but the one from getElementsByClassName is live and updates as the DOM changes — so removing nodes while iterating it skips elements. Converting to a real array fixes both problems, and is worth doing at the point of query rather than at each use.