for...in 遍历对象自身及原型链上所有可枚举字符串键属性,Object.keys() 仅返回自身可枚举字符串键组成的数组,不包含继承属性,更安全可控。

遍历 JavaScript 对象时,for...in 和 Object.keys() 都能拿到属性名,但它们的行为、范围和适用场景有本质区别——关键在于是否包含**原型链上的可枚举属性**,以及返回值类型不同。
for...in:遍历所有可枚举属性(含继承的)
for...in 会遍历对象自身及其原型链上所有**可枚举(enumerable: true)的字符串键属性**。这意味着它可能拿到你没定义在当前对象上、而是从父类或 Object.prototype 继承来的属性。
- 不区分属性来源,只要可枚举就进循环
- 遍历顺序不保证(ES2015+ 对数字键有部分排序,但一般键仍无序)
- 需手动用
hasOwnProperty()过滤掉继承属性,否则容易出错
例如:
const parent = { a: 1 };
const obj = Object.create(parent);
obj.b = 2;
obj.c = 3;
for (let key in obj) {
console.log(key); // 输出 'b', 'c', 'a'(a 来自原型)
}
登录后复制
Object.keys():只取对象自身的可枚举属性名
Object.keys(obj) 返回一个**纯数组**,里面只有对象自身拥有的、可枚举的字符串键(不含 Symbol 键,也不含原型链上的)。
标签: javascript java 工具 区别 字符串数组 为什么
还木有评论哦,快来抢沙发吧~