for in
遍历对象enumerable为true的键
let obj = {
name: "zf",
age: 10
}
for (let i in obj) {
console.log(i)
}
// name age
// 可通过Object.defineProperty 修改 enumerable属性
Object.defineProperty(obj, "name", { enumerable: false })
for (let i in obj) {
console.log(i)
}
// age
class A {
name = "amin"
age = 10
}
for (let i in A) {
console.log(i)
}
// 什么都没有输出 符合enumerable:true的属性没有
Object.defineProperty(A, "name", { enumerable: true })
for (let i in A) {
console.log(i)
}
// name
for of
遍历具有iterator属性的对象, 如果目标对象不可遍历,可以添加[Symbol.iterator]方法,在方法体内部返回一个next函数
const obj = { name: "zf", age: 10}
for (let i of obj) {
console.log(i)
}
// Uncaught TypeError: obj is not iterable at <anonymous>:2:15
obj[Symbol.iterator] = () => {
const keys = Reflect.ownKeys(obj) // 获取到对象的key值列表
let index=0;
return {
next(){
if(index<keys.length - 1){
return {
value: obj[keys[index++]], // 想返回什么 就返回什么 keys[index++]
done:false
}
}
return {
value:keys[index++],
done:true
}
}
}
}
for (let i of obj) {
console.log(i)
}
// name age
const arr = [1,2,3,4,5]
for (let i in arr) {
console.log(i)
}
// 1 2 3 4 5