forEach:该方法是对数组的每个元素执行一次给定的函数;他的返回值是 undefined;
- 与 map() 或者 reduce() 不同的是,它总是返回 undefined 值,并且不可链式调用。 forEach不能改变数组本身,无论是基础数据类型还是引用数据类型都不可以。
但是!可以用改变person.age的方式改变数组
//数组-基本数据类型
let array = [1,2,3,4];
array.forEach(num => {
if(num === 4){
num = 5
}
})
console.log(array) //[1,2,3,4]
//对象-引用类型
let array = [
{
name: '小红',
age: 12
},
{
name: '小明',
age: 18
},
];
array.forEach(person => {
if(person.name === '小红'){
person.age = 15
console.log(person === array[0]) //true
}
})
console.log(array) //[{name: '小红',age: 15},{name: '小明',age: 18},]
- 与 for…of 不同的是他对于空缺的数组单元不进行任何操作;map、for…in 也不会进行操作;
[1,3,,7].forEach(item=> console.log(item))
// 1, 3. 7
for(let i in[1,3,,7]){ console.log(i)}
// 0, 1, 3
for(let i of[1,3,,7]){
console.log(i)
}
// 1, 3, undefined, 7
- 不能使用 breck 跳出循环(报错),使用 return 会跳过本次循环,不会跳出循环(可以在 forEach 代码中使用 return
)
const array1 =['a','b','c'];
array1.forEach(element=>{
if(element ==='a'){
return
}
console.log(element) // 'b', 'c'
});
for…in:以任意顺序遍历一个对象的除Symbol以外的可枚举属性;可以使用 break 跳出循环;在代码中使用 return 会直接报错;在函数体中使用可以跳出循环。
for…of :在可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句 也是不能使用 return ,会报错;在函数体中使用会跳出循环。
for of 不能遍历对象;
for in 遍历的是数组的索引(即键名),而 for of 遍历的是数组元素值。
map() :创建一个新数组,其结果是该数组中的每个元素是调用一次提供的函数后的返回值;不能使用 break 跳出循环;使用 return 该项返回为 undefined; 他不会改变原数组。
var numbers = [1, 4, 9];
var roots = numbers.map(Math.sqrt);
// roots的值为[1, 2, 3], numbers的值仍为[1, 4, 9]
var arr = [0,0,0];
arr.forEach(val => val = 1);
console.log(arr); // (3) [0, 0, 0]
for(var i of arr){i = 1};
console.log(arr); //(3) [0, 0, 0]
arr.map(val =>val = 1);
console.log(arr); //(3) [0, 0, 0]
for(var i in arr){ arr[i] = 1};
console.log(arr); //(3) [1, 1, 1]