-
-
Save minitech/2732683 to your computer and use it in GitHub Desktop.
| // The data | |
| var items = document.getElementsByTagName('p'); | |
| // The old way | |
| var arr = Array.prototype.slice.call(items); | |
| // Pros: | |
| // - Doesn't need a helper method that loops through stuff | |
| // | |
| // Cons: | |
| // - Verbose | |
| // - Doesn't work in IE 8 or lower | |
| // The new way | |
| var arr = Array.apply([], items); | |
| // Pros: | |
| // - Doesn't need a helper method that loops through stuff | |
| // - Reasonably concise | |
| // - Works in IE 7 and 8 at least | |
| // | |
| // Cons: | |
| // - None that I can think of! Take that, old way! (jsPerf test pending.) | |
| // Awesome new way brought to you by Ryan O'Hara (minitech) |
@pimvdb Oh, that's true. Array.apply([], document.getElementById('id')) returns an empty array for me though.
I expected it to return an array containing the DOM node.
Edit: Array.prototype.slice.call(document.getElementById('id')) returns an empty array, too.
@js-coder: .apply expects an array, so:
Array.apply([], [ document.getElementById('id') ]);
But since getElementById returns at most one element, the whole .apply trick is not necessary I think. You could just do [ elem ] to put the element in an array. As I understand it, the gist is about converting an array-like object to a real array, which is a problem you don't encounter with getElementById.
@pimvdb Yeah, I had an error in reasoning. :)
[].slice.call(items); seems to work, too, and it's a bit shorter than the usual way. (It creates a new array though, but I don't think you'll see any real performance difference.)
Argh. Right. And yes, null is better, [] is left over from other experiments.
@js-coder: Still doesn't work in IE, though - that's what I'm trying to fix in a non-frustrating way.
@js-coder: That's what I meant. For
NodeLists the behaviour ofArraydoes not matter because they never consist of a number, but forargumentsit does matter in case you pass a number as the only argument to the function.Array.prototype.slicethrows an error complaining about the type ofthisin IE8.