美文网首页
JS能力测评经典题1

JS能力测评经典题1

作者: 这很重要吗 | 来源:发表于2017-05-15 14:08 被阅读0次

    地址:https://www.nowcoder.com/ta/js-assessment

    题目描述#

    找出元素 item 在给定数组 arr 中的位置


    function indexOf(arr, item) {
      if (Array.prototype.indexOf){
            return arr.indexOf(item);
       } else {
         for (var i = 0; i < arr.length; i++){
                  if (arr[i] === item){
                      return i;
                }
          }
      }     
      return -1;
    }
    

    在IE7的控制台输出Array.prototype.indexOf 结果为undefined ,低版本IE不兼容数组这个方法,因此首先要判断下该方法是否存在。
    ECMAScript提供了两种方法Array.prototype.lastIndexOf()Array.prototype.indexOf()
    indexOf()方法可返回某个指定的字符串值在字符串中首次出现的位置,若未找到,则返回-1。

    function indexOf(arr, item) {
       return arr.indexOf(item);
     }
    
    function indexOf(arr, item) {
        var pos=-1;     //设置一个标记
        arr.forEach(function(item1,index){
            if(arr[index]==item){
                pos=index;
                return;
            }
        }) ;
        return pos;
    }
    
    
    function indexOf(arr,item){
      return arr.indexOf(item)>-1?arr.indexOf(item):-1;
    }
    

    如果是数组嵌套数组,如果是多维的怎么查?


    关于indexOf 方法#

    String 类型的使用##


    let str = 'orange';
    
    str.indexOf('o');  //0
    str.indexOf('n');  //3
    str.indexOf('c');  //-1
    
    let numStr = '2016';
    
    numStr.indexOf('2');  //0
    numStr.indexOf(2);  //0
    

    indexOf 会做简单的类型转换,把数字转换成字符串 '2' 然后再执行。

    Number 类型的使用##


    let num = 2016;
    
    num.indexOf(2);  //Uncaught TypeError: num.indexOf is not a function
    

    如果非要对 number 类型使用 indexOf 方法嘞?那就转换成字符串

    //二逼青年的写法
    num = '2016';
    num.indexOf(2);  //0
    
    //普通青年的写法
    num.toString().indexOf(2);  //0
    
    //文艺青年的写法
    ('' + num).indexOf(2);  //0
    

    Array 类型的使用##


    let arr = ['orange', '2016', '2016'];
    
    arr.indexOf('orange');  //0
    arr.indexOf('o');  //-1
    
    arr.indexOf('2016');  //1,从头匹配直到匹配到时返回第一个数组元素的下标
    arr.indexOf(2016);  //-1,注意:这里不会做隐式类型转换。
    

    indexOf() compares searchElement to elements of the Array using strict equality (the same method used by the === or triple-equals operator).

    注意:这里用的是严格等于(===)

    MDN官网Array.prototype.indexOf()

    Array.prototype.forEach()##

    ECMAScript5中遍历数组元素的新方法,使用forEach()方法

    /*
    * ECMAScript5中遍历数组元素的新方法,使用forEach()方法
    * @ 语法:arr.forEach(callback[, thisArg]);    
    * @ param callback  // 回调函数
    * @ param thisArg   // 改变回调函数里面的this指向
    * @ 语法:arr.forEach(function(value, index, array));
    * @ param value     // 数组的值
    * @ param index     // 数组的索引
    * @ param array     // 数组本身
    */
    
    // forEach循环
    var arr = [1,2,3,4,5];
    arr.forEach(function(value,index, array){
        console.log("第"+ index + "的值是:" + value + ",数组本身:" + array);
    });
    
    /* logs 
    第0的值是:1,数组本身:1,2,3,4,5
    第1的值是:2,数组本身:1,2,3,4,5
    第2的值是:3,数组本身:1,2,3,4,5
    第3的值是:4,数组本身:1,2,3,4,5
    第4的值是:5,数组本身:1,2,3,4,5
    */
    

    注意: 没有办法中止或者跳出 forEach 循环,除了抛出一个异常。如果你需要这样,使用forEach()方法是错误的,你可以用一个简单的循环作为替代。如果您正在测试一个数组里的元素是否符合某条件,且需要返回一个布尔值,那么可使用 Array.every
    Array.some
    。如果可用,新方法 find()
    或者findIndex()
    也可被用于真值测试的提早终止。

    forEach只跳过不存在的元素(不存在索引,但可以访问,如arr[3],值为undefined)##3

    var arr = [1,null,undefined,,5];
    arr.forEach(function(value,index, array){
        console.log("第"+ index + "的值是:" + value);
    });
    
    /* logs 
    第0的值是:1
    第1的值是:null
    第2的值是:undefined
    第4的值是:5
    */
    

    forEach第二个参数改变回调函数里面的this指向###

    例子1:

    var arr = [1,2,3,4,5];
    var arr2 = ["a","b","c","d","e"];
    arr.forEach(function(value, index, array){
        console.log("第"+ index + "的值是:" + value);
        console.log(this);          // 第二个参数改变回调函数里面的this指向  this = ["a", "b", "c", "d", "e"];
    }, arr2);
    

    例子2:

    function Counter() {
      this.sum = 0;
      this.count = 0;
    }
    Counter.prototype.add = function(array) {
      array.forEach(function(entry) {
        this.sum += entry;
        ++this.count;
      }, this);
      // ^---- Note
    };
    
    var obj = new Counter();
    obj.add([2, 5, 9]);
    obj.count;
    // 3 
    obj.sum;
    // 16
    

    因为thisArg参数 (this) 传给了forEach(),每次调用时,它都被传给callback函数,作为它的this值。

    相关文章

      网友评论

          本文标题:JS能力测评经典题1

          本文链接:https://www.haomeiwen.com/subject/mmchxxtx.html