JavaScript中数组的22种方法必学(推荐)(7)

obj.print(); var obj = { name: '张三', times: [1, 2, 3], print: function () { //该this指向obj console.log(this); this.times.forEach(function (n) { //该this同样指向obj console.log(this); },this); } }; obj.print();

  forEach()循环可以用于类数组对象

var str = 'abc'; Array.prototype.forEach.call(str, function(item, index, array) { console.log( item + ':' + index); }); //a:0 //b:1 //c:2

  与for循环不同,对于稀疏数组,forEach()方法不会在实际上不存在元素的序号上调用函数

var a = [1,2,3]; delete a[1]; for(var i = 0; i < a.length; i++){ console.log(a[i]); } //1 //undefined //3 a.forEach(function(item,index,arr){console.log(item)}); //1 //3

  forEach()方法无法在所有元素都传递给调用的函数之前终止遍历。也就是说,没有像for循环中使用的相应的break语句。如果要提前终止,必须把forEach()方法放在一个try块中,并能抛出一个异常

for(var i = 0; i < 5; i++){ if(i == 2) break; } console.log(i);//2 var a = [1,2,3,4,5]; console.log(a.forEach(function(item,index,arr){ if(index == 2) break;//Uncaught SyntaxError: Illegal break statement })); var a = [1,2,3,4,5]; a.forEach(function(item,index,arr){ try{ if(item == 2) throw new Error; }catch(e){ console.log(item); } });

  forEach()方法兼容写法

if(typeof Array.prototype.forEach != 'function'){ Array.prototype.forEach = function(fn,context){ for(var k = 0,length = this.length; k < length; k++){ if(typeof fn === 'function' && Object.prototype.hasOwnProperty.call(this,k)){ fn.call(context,this[k],k,this); } } } }

【filter()】

 filter()方法对数组中的每一项运行给定函数,返回该函数会返回true的项组成的数组。该方法常用于查询符合条件的所有数组项

[1, 2, 3, 4, 5].filter(function (elem) { return (elem > 3); });// [4, 5] [0, 1, 'a', false].filter(Boolean);// [1, "a"] [1, 2, 3, 4, 5].filter(function (elem, index, arr) { return index % 2 === 0; });// [1, 3, 5]

  filter()方法还可以接受第二个参数,指定测试函数所在的上下文对象(this对象)

var Obj = function () { this.MAX = 3; }; var myFilter = function (item) { if (item > this.MAX) { return true; } }; var arr = [2, 8, 3, 4, 1, 3, 2, 9]; arr.filter(myFilter, new Obj());// [8, 4, 9]

  filter()会跳过稀疏数组中缺少的元素,它的返回数组总是稠密的,所以可以压缩稀疏数组的空缺

var a = [1,2,,,,3,,,,4]; console.log(a.length);//10 var dense = a.filter(function(){return true;}) console.log(dense,dense.length);//[1,2,3,4] 4

 如果要压缩空缺并删除undefined和null元素,可以这样使用filter()方法

var a = [1,2,,undefined,,3,,null,,4]; console.log(a.length);//10 var dense = a.filter(function(item){return item!= undefined;}) console.log(dense,dense.length);//[1,2,3,4] 4

  filter()方法兼容写法

if (typeof Array.prototype.filter != "function") { Array.prototype.filter = function (fn, context) { var arr = []; if (typeof fn === "function") { for (var k = 0, length = this.length; k < length; k++) { fn.call(context, this[k], k, this) && arr.push(this[k]); } } return arr; }; }

【some()】

  some()方法对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true。并且当且仅当数值中的所有元素调用判定函数都返回false,它才返回false

a = [1,2,3,4,5]; a.some(function(elem, index, arr){return elem%2===0;})//true a.some(isNaN);//false

  在空数组上调用some()方法会返回false

[].some(function(){});//false

  some()方法兼容写法

if (typeof Array.prototype.some != "function") { Array.prototype.some = function (fn, context) { var passed = false; if (typeof fn === "function") { for (var k = 0, length = this.length; k < length; k++) { if (passed === true) break; passed = !!fn.call(context, this[k], k, this); } } return passed; }; }

【every()】

  every()方法对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true;只要有一项返回false,则返回false

a = [1,2,3,4,5]; a.every(function(elem, index, arr){elem < 10;})//true a.every(function(elem, index, arr){return elem%2 ===0;});//false

  在空数组上调用every()方法会返回true

[].every(function(){});//true

  every()方法兼容写法

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzsyzz.html