2

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

我在这个脚本中找到了一段代码: 鱼眼导航

[].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

4 回答 4

2

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

如果 indexOf 方法不存在,作者只是对其进行了另一种实现。

于 2013-04-29T11:23:04.430 回答
2

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

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

于 2013-04-29T11:23:26.943 回答
1

上面的代码检查函数indexOf是否与Array对象相关联(它在使用低于 1.6 的 Javascript 版本的旧浏览器上不可用)。如果不是,它将以下函数分配给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;
});

indexOf功能在MDN中得到了很好的解释

于 2013-04-29T11:23:58.697 回答
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;
        });
于 2013-04-29T11:29:27.500 回答