for in与for of的区别,以及forEach,map,some,every,filter的区别
一、for in与for of的区别
1 Array.prototype.method=function(){ 2 console.log(this.length); 3 } 4 var myArray=[1,2,4,5,6,7] 5 myArray.name="数组" 6 for (var index in myArray) { 7 console.log(myArray[index]); 8 }
使用for in 也可以遍历数组,但是会存在以下问题:
1.index索引为字符串型数字,不能直接进行几何运算
2.遍历顺序有可能不是按照实际数组的内部顺序
3.使用for in会遍历数组所有的可枚举属性,包括原型。例如上栗的原型方法method和name属性
所以for in更适合遍历对象,不要使用for in遍历数组。
那么除了使用for循环,如何更简单的正确的遍历数组达到我们的期望呢(即不遍历method和name),ES6中的for of更胜一筹.
1 Array.prototype.method=function(){ 2 console.log(this.length); 3 } 4 var myArray=[1,2,4,5,6,7] 5 myArray.name="数组"; 6 for (var value of myArray) { 7 console.log(value); 8 }
记住,for in遍历的是数组的索引(即键名),而for of遍历的是数组元素值。
for of遍历的只是数组内的元素,而不包括数组的原型属性
method
和索引name
遍历对象 通常用for in来遍历对象的键名
1 Object.prototype.method=function(){ 2 console.log(this); 3 } 4 var myObject={ 5 a:1, 6 b:2, 7 c:3 8 } 9 for (var key in myObject) { 10 console.log(key); 11 }
hasOwnPropery方法可以判断某属性是否是该对象的实例属性
1 for (var key in myObject) { 2 if(myObject.hasOwnProperty(key)){ 3 console.log(key); 4 } 5 }
同样可以通过ES5的Object.keys(myObject)获取对象的实例属性组成的数组,不包括原型方法和属性。
1 Object.prototype.method=function(){ 2 console.log(this); 3 } 4 var myObject={ 5 a:1, 6 b:2, 7 c:3 8 } 9 Object.keys(myObject).forEach(function(key,index){<br> console.log(key,myObject[key])<br>})
二、forEach,map,some,every,filter的区别
forEach() 方法对数组的每一个元素执行一次提供的函数。
map() 方法创建一个新数组,其结果是该数组都执行一次函数,原函数保持不变。
filter() 方法使指定函数测试数组的每一个元素,并放回一个通过元素的新数组。
some() 方法测试该数组有元素通过了指定函数的测试,如果有返回true,否则,返回false。
every() 方法测试该数组是否全部通过指定函数测试,全部通过返回true,否则,返回false。
forEach 遍历数组
1 var arr = ["a", "b", "c"]; 2 3 arr.forEach(function(element,index) { 4 console.log(element,index); 5 });
map 返回新数组,为当前元素加字符串m
1 var arr = ["a", "b", "c"]; 2 3 arr.map(function(element,index) { 4 return element += "m"; 5 }); 6 7 // 将给定数组的元素转成整数 8 9 ["1", "2", "3"].map(parseInt); // [1, NaN, NaN] 10 // 等价于 11 ["1", "2", "3"].map(function(value,index,array){ 12 return parseInt(value,index); 13 }); 14 parseInt(3,1); // NaN parseInt(string, radix) 函数将给定的字符串以指定基数解析成为整数。
filter 返回大于10的元素
1 // 12, 130, 44 2 var arr = [12, 5, 8, 130, 44]; 3 arr.filter(function(value){ 4 return value>10 5 }); 6 // 等价于 7 arr.filter((value)=>value>10);
some 判断当前数组有元素大于10的元素
1 var arr = [12, 5, 8, 130, 44]; 2 arr.some(function(value){ // true 3 return value>10 4 });
every 判断当前数组所有元素是否都大于10
1 var arr = [12, 5, 8, 130, 44]; 2 arr.every(function(value){ // false 3 return value>10 4 });