对象遍历
forin
- 可以遍历自身和原型上的所有可枚举对象
const obj = {
name:'name',
age:15,
[Symbol('aa')]:'symbol' // Symbol
}
// 添加一个不可枚举属性
Object.defineProperties(obj,{
class:{
value:'三年级一班',
enumerable:false
}
})
// 给obj的原型添加属性
Object.defineProperties(obj.__proto__, {
sex:{
value:'女',
enumerable:true
},
sex1:{
value:'女1',
enumerable:false
},
[Symbol('bb')]:{
value:'bb',
enumerable:false
},
[Symbol('cc')]:{
value:'cc',
enumerable:true
}
})
for(const name in obj) {
console.log('name:', name);
if (Object.prototype.hasOwnProperty.call(obj, name)) { // 属于对象本身的属性
console.log('name1:', name);
}
}
// name: name
// name1: name
// name: age
// name1: age
// name: sex
Object.keys()
- 返回自身可枚举的属性集合
Object.keys(obj) // [name,age]
Object.getOwnPropertyNames()
- 返回自身除symbol之外可枚举不可枚举的属性
Object.getOwnPropertyNames(obj) // [name,age,class]
Object.getOwnPropertySymbols()
- 返回自身所有可枚举不可枚举的symbol属性
Object.getOwnPropertySymbols(obj) // [Symbol('aa')]
Reflect.ownKeys()
- 返回自身所有属性
Reflect.ownKeys(obj) // ['name', 'age', 'class', Symbol(aa)]
Object.values()
- 返回自身可枚举属性的值
Object.values(obj) // ['name', 15]
Object.entries()
- 返回自身可枚举属性键值对
Object.entries(obj) // [['name','name'], ['age',15]]
总结
- 只有forin可以遍历到原型上的属性
- Object.getOwnPropertyNames 和 Reflect.ownKeys 可获取到不可枚举的属性
- Object.getOwnPropertySymbols 和 Reflect.ownKeys 可获取到 Symbol 属性
数组遍历
for
- break 结束循环
- continue 跳出本次循环
- return 直接跳出函数
forof
- 遍历可迭代对象 array、string、map、set
- break 结束循环
- continue 跳出本次循环
let arr = [1,2,3]
for (const iterator of arr) {
console.log(iterator)
}
// 1
// 2
// 3
let map = new Map([[1,2],[2,3]])
for (const [key,value] of map) {
console.log(key,value)
}
// 1 2
// 2 3
forEach
- 不改变原数组
- 循环过程中不可以停止
- 没有返回值(返回undefined)
map
- 循环过程中不可以停止
- 返回新数组
- 不改变原数组
find/findIndex
- find返回数组中第一个满足条件的第一个元素的值,否则返回undefined。
- findIndex()返回满足条件的第一个元素值的索引,否则返回undefined。
filter
- 返回符合条件的新数组
reduce / reduceRight
- 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值
- reduce从左到右,reduceRight从右往左
const arr = [1, 2, 3]
const arrR = arr.reduce((pre, cur, item, array) => {
pre.push(++cur)
return pre
}, [])
console.log(arrR)
// [2, 3,4]
some/every
- some 只要数组中有一条数据符合条件就返回true,否则false
- every 数组的每一个元素都符合条件返回true,否则返回false
怎么排序数组
sort()
- sort() 默认是将元素转化成字符串进行比较。对于数值型排序不很准确,sort函数可接收一个比较函数,解决这个问题
let arr = [1,3,5,50,15]
arr.sort() // [1,15,3,5,50]
正序排列
arr.sort((a,b)=>a-b) // [1,3,5,15,50]
逆序排列
arr.sort((a,b) => b-a) // [50,15,5,3,1]
算法排序
参见:算法排序