Array.prototype - 不确定这是做什么的! (Q1)

时间:2013-04-29 11:18:33

标签: javascript prototype

值得一提的是,我是一个“中途体面”的Javascript程序员,但是真正学习Javascript的想法就像我见过的一些巧妙的东西一样,看起来令人生畏。我只是一个非OOP php程序员,JS似乎是一个全新的世界。

我在此脚本中找到了一段代码: fisheye navigation

[].indexOf||(Array.prototype.indexOf=function(v,n){
        n=(n==null)?0:n;var m=this.length;
        for(var i=n;i<m;i++)if(this[i]==v)return i;
        return-1;
});

老实说,我甚至没有看到它为变量赋值!看来作者正在嗅探indexOf方法,但这没有意义......

我认为如果我逐节剖析这段代码(看起来写得非常好),我将继续深入探讨更深层次的javascript概念。谢谢!

4 个答案:

答案 0 :(得分:2)

  

Internet Explorer 8和Internet不支持indexOf()方法   早。   http://www.w3schools.com/jsref/jsref_indexof_array.asp

如果indexOf方法不存在,那么作者只会另外实现它。

答案 1 :(得分:2)

这是Array.prototype.indexOf方法(https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf)的polyfill。您可以在此处查看支持表:http://kangax.github.io/es5-compat-table/#Array.prototype.indexOf

此代码的作用是通过检查数组文字上的方法来查看Array.prototype.indexOf是否存在。如果它没有为Array.prototype.indexOf分配一个函数,基本上填补了缺少的功能。

答案 2 :(得分:1)

上面的代码检查函数indexOf是否与Array对象(It is not available on older browsers using versions of Javascript below 1.6)相关联。如果没有,它会将以下函数分配给Array对象的原型

// v is the element you are checking for in the array and n is the index from which the check starts
Array.prototype.indexOf = function(v,n) {

    // check if the "fromIndex" n has been specified, if not start the check from the first element
    n= (n==null) ? 0 : n;
    // m stores the length of the array in which the check is being performed
    var m=this.length;
    // using the for loop to iterate each element of the array
    for(var i=n;i<m;i++)
        if(this[i]==v)    // checking if the array element (this refers to the array) is the same as the supplied value, if so it returns the index of the element which matches the supplied value  
            return i;
    // If supplied value is not found in the array, the return value is -1
    return-1;
});

MDN

详细解释了indexOf功能

答案 3 :(得分:0)

分解后的解释:

//find out if indexOf exists if not add function to prototype
   [].indexOf||(Array.prototype.indexOf=function(v,n){

            //start search at n which is passed in, if n is not passed in start at 0
            n=(n==null)?0:n; 

            // get length of array
            var m=this.length; 

            for(var i=n;i<m;i++)
            {
               //if you find the value return it
               if(this[i]==v)return i; 
            }

            //if value wasnt found return -1
            return-1;
        });