JS能力测评经典题1

2017-05-15  本文已影响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值。

上一篇下一篇

猜你喜欢

热点阅读