- for
??最簡單的一種循環(huán)遍歷方法区匠,也是使用頻率最高的一種尖昏,可優(yōu)化
var arr = [1, 2, 3, 4, 5, 6]
for(var i = 0; i < arr.length; i++) {
console.log(arr[i])
}
// 1 2 3 4 5 6
優(yōu)化:使用臨時變量,將長度緩存起來掖肋,避免重復獲取數組長度,當數組較大時優(yōu)化效果才會比較明顯
var arr = [1, 2, 3, 4, 5, 6]
var len = arr.length
for(var i = 0; i < len; i++) {
console.log(arr[i])
}
// 1 2 3 4 5 6
- for…in…
??效率最低(輸出的 key 是數組索引)
var arr = ['蘋果', '橘子', '香蕉', '葡萄', '草莓', '芒果']
for(var key in arr) {
console.log(key)
}
// 0 1 2 3 4 5
- for…of…(ES6)
??性能要好于 for…in…赏参,但仍然比不上普通的 for 循環(huán)(不能循環(huán)對象)
var arr = ['蘋果', '橘子', '香蕉', '葡萄', '草莓', '芒果']
for(var key of arr) {
console.log(key)
}
// 蘋果 橘子 香蕉 葡萄 草莓 芒果
- forEach(ES6)
????數組里的元素個數有幾個,該方法里的回調就會執(zhí)行幾次
????第一個參數是數組里的元素沿盅,第二個參數為數組里元素的索引把篓,第三個參數則是它自己
????數組自帶的遍歷方法,雖然使用頻率略高腰涧,但是性能仍然比普通循環(huán)略低
var arr = [1, 2, 3, 4, 5, 6]
arr.forEach(function (item, idnex, array) {
console.log(item) // 1 2 3 4 5 6
console.log(array) // [1, 2, 3, 4, 5, 6]
})
- map(ES6)
????遍歷每一個元素并且返回對應的元素(可以返回處理后的元素) (map 映射 一 一 對應)
????返回的新數組和舊數組的長度是一樣的
????使用比較廣泛韧掩,但其性能還不如 forEach
var arr = [1, 2, 3, 4, 5, 6]
var newArr = arr.map(function (item, idnex) {
// 第一個參數是值 第二個參數是索引值
return item * item
})
console.log(newArr) // [1, 4, 9, 16, 25, 36]
// 要添加代碼塊 map 不可以解析同一個塊級作用域
// {}{}代表不同的塊級作用域 分別在不同里面寫
// 淺拷貝
// 淺拷貝是指a把值 給了b 當b的值改變 a b 的值同時改變。
let list = [
{ id: 23, title: "女裝1",price: 100},
{ id: 23, title: "女裝2",price: 200},
{ id: 23, title: "女裝3",price: 300}
]
let newArr = data.list.map((item, index) => {
item.price = item.price * .6
return item;
});
console.log(newArr)//打印的結果價格都是改變的窖铡,一樣的
// {
// 0: {id: 23, title: "女裝1", price: 60}
// 1: {id: 24, title: "女裝2", price: 120}
// 2: {id: 27, title: "女裝3", price: 180}
// }
console.log(data.list)//同上
// 深拷貝
// 深拷貝是指a b 的值無論哪個值改變 內存地址不同 互不干擾
// 深拷貝1
let newArr = list.map(item => {
// es6箭頭函數疗锐,可以只寫一個參數
// 使用深拷貝需要重新定義一個空的來接收改變的數據
let newPrice = item.price * 0.6
return {
id: item.id,
title: item.title,
price: newPrice
}
})
console.log(newArr) // price對應的數據發(fā)生改變坊谁,同上
console.log(list) // 原數據不發(fā)生改變
// 深拷貝 2(簡單粗暴)
// JSON.stringify 把對象轉為字符串
// JSON.parse 把字符串轉化為對象
let newList = JSON.parse(JSON.stringify(list))
let newArr = newList.map(item => {
item.price *= 0.6
return item
})
console.log (newArr) //同深拷貝1
console.log (list) //同深拷貝1
- filter(ES6)
??遍歷數組,過濾出符合條件的元素并返回一個新數組
var arr = [
{ id: 1, name: '小明', done: true },
{ id: 2, name: '小華', done: true },
{ id: 3, name: '小紅', done: false }
]
var newArr = arr.filter(function (item, index) {
return item.done
})
console.log(newArr)
// [{ id: 1, name: '小明', done: true },{ id: 2, name: '小華', done: true }]
- some(ES6)
??遍歷數組滑臊,只要有一個以上的元素滿足條件就返回 true口芍,否則返回 false
var arr = [
{ id: 1, name: '小明', done: true },
{ id: 2, name: '小華', done: true },
{ id: 3, name: '小紅', done: false }
]
var bool = arr.some(function (item, index) {
return item.done
})
console.log(bool) // true
- every(ES6)
??遍歷數組,每一個元素都滿足條件 則返回 true雇卷,否則返回 false
var arr = [
{ id: 1, name: '小明', done: true },
{ id: 2, name: '小華', done: true },
{ id: 3, name: '小紅', done: false }
]
var bool = arr.every(function (item, index) {
return item.done
})
console.log(bool) // false
- find(ES6)
??遍歷數組鬓椭,返回符合條件的第一個元素,如果沒有符合條件的元素則返回 undefined
var arr = [1, 1, 2, 2, 3, 3, 4, 5, 6]
var num = arr.find(function (item, index) {
return item === 3
})
console.log(num) // 3
- findIndex(ES6)
???遍歷數組关划,返回符合條件的第一個元素的索引小染,如果沒有符合條件的元素則返回 -1
var arr = [1, 1, 2, 2, 3, 3, 4, 5, 6]
var num = arr.findIndex(function (item) {
return item === 3
})
console.log(num) // 4
- reduce (ES6)
用來實現累加的效果
輸出的總和是 sum+val(數值)
// reduce 用來實現累加的效果 (常用于寫購物車價格的累加)
// 聲明一個數組 數組里面放數字 讓其里面的數字顯示為累加的總和
let arr=[200,200,100]
let result =arr.reduce((sum,val,index)=>{
200+200 index
400+100 index
// sum是總加后的和 val是變量里面的值 index為索引值
console.log(sum,val,index)
// 200 200 1
// 400 100 2
return sum +val;
})
console.log(result) // 500