一、for in | for of
1)for in
for...in...用于遍歷數(shù)組或者對象的屬性摩桶。這屬性包括自身的屬性和原型鏈的可枚舉的屬性P分狻(非整數(shù)類型的名稱和繼承的那些)
該遍歷方法返回的先后次序可能會因瀏覽器(宿主環(huán)境)而異;
因此不建議用 for...in...去遍歷數(shù)組
let arr = [1,2,3];
let obj = {
name:'JY',
age:23.5
}
for(let key in arr/obj){
console.log(key);
//arr : 0,1,2 (0,1,2是String類型)
//過濾繼承的屬性的方法:
obj.hasOwnProperty(key)
// obj : name,age
}
2) for...of...
for...of...可以用來遍歷有迭代器(iterator)的集合(數(shù)組懒叛,類數(shù)組烦租,Map延赌,Set,string叉橱,arguments等)挫以,不建議用來遍歷對象,遍歷對象建議用for...in...(本質(zhì)工作)
//遍歷數(shù)組
let arr = [2,3,4];
for(let value of arr){
console.log(value); // 1,2,3
}
//遍歷字符串
let str = 'boo'
for(let value of str){
console.log(value); // 'b','o','o'
}
...
for...of...方法遍歷數(shù)組時窃祝,可以正確相應break掐松、continue、return語句
二锌杀、常用數(shù)組遍歷方法
1)arr.forEach();
forEach() 方法對數(shù)組的每個元素執(zhí)行一次提供的函數(shù)甩栈。
forEach()方法不能使用break、continue糕再、return等語句
forEach()方法不會改變原數(shù)組量没。
用法
[1,2,3].forEach(function(value,index,arr){
console.log(value,index,arr);
// 1,0,[1,2,3]
// 2,1,[1,2,3]
// 3,2,[1,2,3]
},this)
// this,表示函數(shù)內(nèi)的this指向⊥幌耄可以
2)arr.map()
map() 方法創(chuàng)建一個新數(shù)組殴蹄,其結果是該數(shù)組中的每個元素都調(diào)用一個提供的函數(shù)后返回的結果。
即返回每個元素執(zhí)行回調(diào)的返回值猾担,組成的新數(shù)組
var numbers = [1, 4, 9];
var roots = numbers.map(Math.sqrt);
// roots的值為[1, 2, 3], numbers的值仍為[1, 4, 9]
3) arr.reduce()
對數(shù)組中的所有元素調(diào)用指定的回調(diào)函數(shù)袭灯。該回調(diào)函數(shù)的返回值為累積結果,并且此返回值在下一次調(diào)用該回調(diào)函數(shù)時作為參數(shù)提供绑嘹。
reduce(function,initialValue)
initialValue 用作第一個調(diào)用 callback的第一個參數(shù)的值稽荧。 如果沒有提供初始值,則將使用數(shù)組中的第一個元素
//數(shù)組里所有值的和
var sum = [0, 1, 2, 3].reduce(function (a, b) {
return a + b;
}, 0);
// sum is 6
//將二維數(shù)組轉(zhuǎn)化為一維
var flattened = [[0, 1], [2, 3], [4, 5]].reduce(
function(a, b) {
return a.concat(b);
},
[]
);
// flattened is [0, 1, 2, 3, 4, 5]
4) arr.every()
every()方法測試數(shù)組的所有元素是否都通過了指定函數(shù)的測試工腋。
只有每個callback函數(shù)返回true姨丈,整個arr.every()才會返回true畅卓,否則false
function isBigEnough(element, index, array) {
return (element >= 10);
}
var passed = [12, 5, 8, 130, 44].every(isBigEnough);
// passed is false
passed = [12, 54, 18, 130, 44].every(isBigEnough);
// passed is true
5) arr.some()
some()方法與every()方法相反,只要子元素中有一個令callback函數(shù)返回true蟋恬,則整個arr.some()返回true翁潘;全不滿足則返回false;
const isBiggerThan10 = (element, index, array) => {
return element > 10;
}
[2, 5, 8, 1, 4].some(isBiggerThan10);
// false
[12, 5, 8, 1, 4].some(isBiggerThan10);
// true
array.slice()是對數(shù)組的深/淺拷貝,不會影響原數(shù)組的內(nèi)部結構
num | 0 向上取整 Math.floor()類似