《献给你,我深爱的ECMAScript》之Array篇

本文主要说说ECMAScript的Array相关

如何判定是否是数组

        //underscore 1.5.1
        //2012-02-22 1.0.0版本 ratbeard增加了对ES5的支持
        //https://github.com/jashkenas/underscore/commit/b774bf7ca9770625c0dffa99d46c14f22fdf7776
        //ratbeard的博客:http://www.mikefrawley.com/work.html
        var nativeIsArray = Array.isArray,
            toString = Object.prototype.toString; 

        _.isArray = nativeIsArray || function(obj){
            return toString.call(obj) == '[object Array]';
        }


        //tangram 2.0.2.5
        //一般做法走toString
        baidu.lang.isArray = function(source){
            return Object.prototype.toString.call(source) == '[object Array]';
        }


        //qwrap 1.1.5
        //最早看到这个设计后,我就主动加入到我的博客了
        //slice截断的:[object Object] --> Object
        //忘了slice的参数,请看这里:http://zhangyaochun.iteye.com/blog/1450716
        function getConstructorName(o){
            if(o != null && o.constructor != null){
                return Object.prototype.toString(o).slice(8,-1);
            }else{
                return '';
            }
        }

        isArray:function(obj){
            return getConstructorName(obj) == 'Array';
        }

    

array的indexOf?


        //kissy 1.3.0
        var indexOf = Array.prototype.indexOf;
        indexOf:indexOf ? 
            function(item,arr){
                return indexOf.call(arr,item);
            } :
            function(item,arr){
                for(var i = 0,len = arr.length;i < len;++i){
                    if(arr[i] === item){
                        return i;
                    }
                }

                return -1;
                
            };


        //tangram 1.5.2.2
        //其实最开始看到第三个参数的时候,当时我还是小惊,没有想到
        baidu.array.indexOf = function(source,match,formIndex){
            var len = source.length,
                iterator = match;

            //可选参数设置默认值的做法    
            fromIndex = fromIndex | 0;
            
            //相比下面qwrap的做法,我喜欢Math.max的设计
            if(formIndex < 0){
                formIdx = Math.max(0,len + fromIndex);
            }    
            for(;fromIndex < len;formIdx++){
                if(formIdx in source && source[formIdx] === match){
                    return formIdx;
                }
            }

            return -1;
        }


        //qwrap
        //qwrap有意思的地方是手册里面在arr.indexOf备注这:如果浏览器已支持indexOf,则会调用浏览器默认的该方法 
        indexOf: function(arr,obj,formIdx){
            var len = arr.length;
            formIdx != 0;
            if(formIdx < 0){
                formIdx += len;
            }

            //我还是喜欢优雅的Math.max(0,len + fromIndex);
            if(formIdx < 0){
                formIdx = 0;
            }

            for(;formIdx < len;formIdx++){
                if(formIdx in arr && arr[formIdx] === obj){
                    return formIdx;
                }
            }

            return -1;
        }
    

array的lastIndexOf

        var lastIndexOf = Array.prototype.lastIndexOf;

        lastIndexOf: (lastIndexOf) ?
            function(item,arr){
                return lastIndexOf.call(arr,item);
            } :
            function(item,arr){
                for(var i=arr.length-1;i>=0;i--){
                    if(arr[i] === item){
                        break;
                    }
                }

                return i;
            };



        //tangram 1.5.2.2
        baidu.array.lastIndexOf = function(source,match,fromIndex){
            var len = source.length;
            fromIndex = fromIndex | 0;

            if(!fromIndex || fromIndex > len){
                fromIndex = len - 1;
            }

            if(fromIndex < 0){
                fromIndex += len;
            }

            for(;fromIndex >= 0;fromIndex --){
                if(fromIndex in source && source[fromIndex] === match){
                    return fromIndex;
                }
            }

            return -1;

        };        
    

如需转载,烦请注明出处:http://www.w3cplus.com/js/ecmascript-lesson-6.html

返回顶部