Created
May 19, 2012 22:52
-
-
Save minitech/2732683 to your computer and use it in GitHub Desktop.
Why you should use my new way to convert to an array
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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) |
@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.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@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.