You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何for..in循环中继承属性晚于对象自身属性输出?

为什么for..in循环中自有属性先于继承属性输出?

首先看代码示例:

let animal = {
  eats: true
};

let rabbit = {
  __proto__: animal, // (*)
  jumps: true, // (**)
};

console.log(Object.keys(rabbit)); // [jumps]

for(let prop in rabbit) console.log(prop); // jumps, eats

核心原因分为两点:

  • __proto__并非普通自有属性
    在对象字面量中声明__proto__: animal,并不是给rabbit添加一个名为__proto__的自有属性,而是用来设置该对象的原型指向animal。所以rabbit的自有属性只有jumps,这也是Object.keys(rabbit)仅返回["jumps"]的原因——它只会枚举对象的自有可枚举属性。

  • for..in循环的遍历逻辑
    for..in的遍历顺序遵循固定规则:

    1. 先遍历对象自身的所有可枚举属性,按照属性被添加到对象的顺序输出;
    2. 再依次遍历原型链上每个原型对象的可枚举属性,每个原型内的属性同样遵循插入顺序。
      这里rabbit的自有属性只有jumps,会被优先输出;之后遍历它的原型animal的可枚举属性eats,所以eats会在后面输出。

额外说明:哪怕把__proto__的声明放在jumps之后,结果也完全一致——因为__proto__的作用是设置原型,既不会成为自有属性,也不影响自有属性的遍历顺序。

内容的提问来源于stack exchange,提问作者Даниил Дорофеев

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:02:22