I am currently using the Chrome console to do some debugging for a Greasemonkey script.
From the console I run var opp = document.querySelectorAll(\'a[class=\"F-re
First,
Array.prototype, although it is intentionally generic so can be called on other Arraylike objectsthis via call or applysplice needs to be able to assign on it's this, which will fail for a NodeList as you will get the following TypeError: Cannot set property length of #<NodeList> which has only a getterthis will work on a NodeList, e.g. slice, map, indexOf, forEach, filter, some, every, etc..Now we are in a position to do something,
Array.prototype.slicesplice on this object insteadSo,
var opp = document.querySelectorAll('a[class="F-reset"]'); // NodeList
oop = Array.prototype.slice.call(oop); // Array
// ...
oop.splice(0, 1);
Yes, this is because the result of querySelectorAll is a node list, not an array. You can apply the slice method of Array to a node list, however:
Array.prototype.slice.call(op, 0, 1);
This works more or less as expected, because a NodeList "quacks" in just the way slice expects, i.e. it contains elements indexed sequentially. However, you should be wary of using this in general; it is much safer to simply iterate over the NodeList.
querySelectorAll returns a NodeList. This is similar to an array (it has a .length property and you can index it with []), but it's not actually an array, and doesn't have most of the array methods. If you want to use array methods on an array-like object, you have to call the method explicitly:
Array.prototype.splice.call(opp, 0, 1);
or:
[].splice.call(opp, 0, 1);
However, another difference between arrays and NodeLists is that you can't modify NodeList in place, which .splice tries to do; you can only read them like arrays. You should just use .slice() to extract the parts you want. Or convert the NodeList to an array first, and then operate on that. See
Fastest way to convert JavaScript NodeList to Array?
querySelector/All returns a NodeList not an array, so those functions are not available.
You can use call to use those array methods though
[].splice.call(opp,0,1);
The first argument is the execution context that the function will use, all other arguments are the arguments that will be passed to the function
Function call reference