javascriptarraysiterationprototype-programming

Javascript array extension method gets iterated in for loop


I have created a JavaScript extension for an array object as follows:

Array.prototype.where = function (lamda) {
var results = [];

for (var i in this) {
    if (lamda(this[i])) {
           results.push(this[i]);
        }
    }

    return results;
}

When I iterate through the array using a for loop like:

var myArray = [1,2,3,4];

for(var i in myArray){
   alert(myArray[i]);
}

...my extensions are enumerated as well.

Any ideas?


Solution

  • This behavior is by design.
    for / in loops iterate over every property in an object, including those inherited from prototypes.

    You can check if (myArray.hasOwnProperty(i)) to skip inherited properties.

    However, you should use a regular for loop instead.
    Javascript's for / in loop is not intended to loop over arrays.