一个js获取数组下标的函数

  或许,面试的时候,你可能会被问到怎么模拟字符串的indexOf()函数获取数组的下标,这里是个人实现的一个小函数,里面包含的知识点挺多的,假如是新手,看不懂的地方可以百度,这里就不做详细介绍了,当然,看不懂也可以给我留言,有空会回复你的。

/*
    获取数组元素的下标,
    第一个参数为数组的元素,可为复合类型,但不能为函数和undefined,也不能为空
    第二个参数,要从哪个位置向后查找,
    负数为从后面位置查找,查找的方向依然是向后查找,
    比如说-1,就是最后的位置向后查找,也就是只能和最后一个元素相匹配
    */
    Array.prototype.indexof=function(value,fromindex){
        var arr = this.valueOf(),len=this.length;
        //如果arr不是数组或者第一个参数为空或者undefined,则返回false
        if(toString.call(arr) !== ‘[object Array]‘ || value === ‘‘ || value === undefined || toString.call(value) === ‘[object Function]‘){
            return false;
        }
        //默认第一个参数为0
        if(fromindex === undefined){
            fromindex = 0;
        }
        //第二个参数不是数字返回false
        if(toString.call(fromindex) !== ‘[object Number]‘){
            return false;
        }
        //判断第二个参数是否为负数
        if(fromindex<0){
            fromindex = Math.abs(fromindex);
            //超过搜索范围
            if(len < fromindex){
                return -1;
            }else{
                //负数则从后面开始向后搜索
                fromindex = len - fromindex;
            }
        }
        //开始查找
        for(var i=0+fromindex;i<len;i++){
            if(value === arr[i]){
                return i;
            }else{
                //判断数据类型相等
                if(toString.call(arr[i]) === toString.call(value)){
                    //判断数据值相等
                    if(JSON.stringify(arr[i]) === JSON.stringify(value)){
                        return i;
                    }else{
                        return -1;
                    }
                }
            }
        }
        return -1;
    }
    //测试
    var arr1 = [1,9,0,‘w‘,4,5,[1,6],{‘u‘:1,‘a‘:2},null];
    var ob = {‘u‘:1,‘a‘:2};
    var ob1 = {‘u‘:1,‘a‘:3};
    var get=function(){};
    var a = [1];
    var b = [1,6];
    alert(arr1.indexof(b));

  依然那句老话,如果有错误或着bug,还望看官提出,免得误导其他人。

时间: 2024-10-13 15:08:46

一个js获取数组下标的函数的相关文章

WebView中Js与Android本地函数的相互调用

介绍 随着Html5的普及,html在表现力上不一定比原生应用差,并且有很强的扩展兼容性,所以越来越多的应用是采用Html与Android原生混合开发模式实现. 既然要实现混合开发,那么Js与Android原生函数的相互调用就必不可少了.这里写了一个demo,实现点击html中的图片进行本地展示. 原理 1.Android调用js很简单,直接webView.loadUrl("javascript:JS中的方法名称()");即可. 2.js调用Android方法,需要使用WebView.

js中如何在一个函数里面执行另一个函数

1.js中如何在函数a里面执行函数b function a(参数c){ b(); } function b(参数c){ } ps:在需要传参的情况下,函数a里面的参数c同时可以传到函数b里面. 2.如何20秒后执行另一个函数 function a(){ setTimeout(b,20000)}function b(){ alert("20秒以后了哦")} 3.什么是回调函数 回调就是一个函数的调用过程.回调,回调,就是回头调用的意思.函数a的事先干完,回头再调用函数b. 函数a有一个参

【juincen】Java中的接口interface类比js中的回调函数

前几天在左讯飞语音的时候,无意间意识到java中的接口和js中常用的回调函数有点类似,今天在这儿整理一下思路. interface,Java中的接口,为什么会有这个东西. 一,预留声明 比如两个程序员A和B,A要写一段程序,其中需要调用到B写的程序.这时候A可以写一个接口: public interface Demo{ void deal(); } A要调用的方法先“预留声明”在接口里:deal 然后B去完善这个接口,B写了一个实现类实现了这个Demo接口. A在自己的业务逻辑里面只用调用接口的

简单模拟jQuery创建对象的方法,以及封装一个js动画框架

今天无事点开了N年未点开的慕课网,看了一个js动画框架的视频,心血来潮用jQuery的方法封装了一下,虽然不如jQuery,但是还是有点点所获. 什么都不说,直接上代码: /** * 这是框架的唯一对象,使用jQuery框架的创建方法 * @class MyAnimation * @constructor */ function MyAnimation(Selector){ //返回MyAnimation原型链中init()方法创建的对象 return new MyAnimation.proto

JQuery之JQuery的版本 JQuery入门 属性获取 JQuery就绪函数 JS文档就绪函数和JQuery文档就绪函数的区别 JS对象和JQuery对象的区别 关于$的使用 多个JS库的冲突解决方案

JQuery的版本 JQuery入门 属性获取 JQuery就绪函数 JS文档就绪函数和JQuery文档就绪函数的区别 JS对象和JQuery对象的区别 关于$的使用 多个JS库的冲突解决方案 JQuery的版本 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>jQuery的版本</title> <

underscore.js中的节流函数debounce及trottle

函数节流   throttle and debounce的相关总结及想法 一开始函数节流的使用场景是:放止一个按钮多次点击多次触发一个功能函数,所以做了一个clearTimeout setTimeout函数 clearTimeout(cancelTimer); cancelTimer =setTimeout(function(){ switchControl.switchAciontFactory(view, conf); },300) 代码的意思就不做多说了,实际上我无意间实现了一个debou

JavaScript笔记(三):JS也有入口函数Main

在C和Java中,都有一个程序的入口函数或方法,即main函数或main方法.而在JavaScript中,程序是从JS源文件的头部开始运行的.但是某种意义上,我们仍然可以虚构出一个main函数来作为程序的起点,这样一来不仅可以跟其他语言统一了,而且说不定你会对JS有更深的理解. 1. 实际的入口 当把一个JavaScript文件交给JS引擎执行时,JS引擎就是从上到下逐条执行每条语句的,直到执行完所有代码. 2. 作用域链.全局作用域和全局对象 我们知道,JS中的每个函数在执行时都会产生一个新的

js设定延迟时间的函数

1.如果想要在执行一个js函数之前延迟一段时间应该怎么做? 答:"setTimeout('update()',1000);" 其中update()函数就是延迟后执行的函数,后面的时间单位为ms. 实例一: <script language="javascript"> var i;// 第10行代码 setTimeout("abc()",5000); function abc(){ // 第11行代码以后的全部放在这个函数里 alert

JS中关于把函数作为另一函数的参数的几点小总结

//JS中关于把函数作为函数的参数来传递的问题的小总结//第一,最简单的形式无参函数,直接形式函数的函数名放到括号中,再在执行部分这个函数即可.//当然调用时要穿另一个真正的定义好的函数/*function test1(Func){Func();}function test2(){alert("我是test2");}test1(test2);*/ //第二种,带参数的普通调用法.跟第一种唯一的区别就是在定义主函数的执行语句里调用参数函数时该把参数加上/*function test1(F