日常学习2024.2.7-for.in和Object.keys的区别,for.in和for.of的区别

本文详细比较了JavaScript中for.in和Object.keys的区别,强调for.in遍历对象包括继承属性,而Object.keys仅限自身属性。同时介绍了for.of用于遍历可迭代对象的优势,以及如何通过Object.entries等方法将对象转换为可迭代形式以遍历其属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

日常学习2024.2.7-for.in和Object.keys的区别,for.in和for.of的区别

1.for.in和Object.keys的区别

(1)for…in
for…in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。
(2)Object.keys(obj)
Object.keys返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。

// 定义一个父对象
const parent = {
  parentProp: 'Parent Property'
};

// 定义一个子对象,继承自父对象
const child = Object.create(parent);
child.childProp = 'Child Property';

// 遍历子对象及其原型链上的属性
for (let key in child) {
  console.log('key1 '+key + ':', child[key]);
}
for(let key of Object.keys(child)) {
  console.log('key2 '+key + ':', child[key]);
}

结果:
在这里插入图片描述
最好用Object.keys()

2.for.in和for.of的区别

for…in:主要用于遍历对象的可枚举属性。当你对一个数组使用for…in时,它实际上会遍历数组的所有可枚举属性,包括那些从原型链上继承的属性。因此,当使用for…in遍历数组时,它可能会遍历到一些非预期的属性。
for…of:主要用于遍历可迭代对象(iterable),如Array、Map、Set、String、TypedArray、arguments对象等。它按照可迭代对象的定义顺序来遍历。

for…in

// 定义一个对象  
var person = {  
    firstName: "John",  
    lastName: "Doe",  
    age: 30,  
    isStudent: false  
};  
  
// 使用for...in循环遍历对象的属性  
for (var key in person) {  
    if (person.hasOwnProperty(key)) { // 使用hasOwnProperty来确保只遍历对象自身的属性,不包括原型链上的属性  
        console.log("属性名: " + key + ", 值: " + person[key]);  
    }  
}

for…of

// 定义一个数组  
var numbers = [1, 2, 3, 4, 5];  
  
// 使用for...of循环遍历数组元素  
for (var number of numbers) {  
    console.log(number);  
}

在JavaScript中,for…of 循环不能直接用于遍历对象的属性,因为对象本身不是可迭代对象(iterable)。for…of 循环是为可迭代对象设计的,比如数组、字符串、Map、Set、TypedArray等。

如果你想要使用 for…of 遍历对象的属性,你需要首先将对象转换为一个可迭代的值集合。这通常通过 Object.values(obj)、Object.entries(obj) 或 Object.keys(obj) 来实现,它们分别返回对象值、键值对和键的数组。

下面是一个使用 for…of 遍历对象属性的例子,这次我们通过 Object.entries(obj) 将对象转换为键值对数组:

// 定义一个对象  
var person = {  
    firstName: "John",  
    lastName: "Doe",  
    age: 30  
};  
  
// 使用Object.entries()将对象转换为键值对数组,然后使用for...of遍历  
for (var [key, value] of Object.entries(person)) {  
    console.log(`属性名: ${key}, 值: ${value}`);  
}
//属性名: firstName, 值: John  
//属性名: lastName, 值: Doe  
//属性名: age, 值: 30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值