地址: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值。