枚举性如何决定Object.assign拷贝结果的本质差异?

2026-05-07 02:040阅读0评论SEO基础
  • 内容介绍
  • 相关推荐

本文共计572个文字,预计阅读时间需要3分钟。

枚举性如何决定Object.assign拷贝结果的本质差异?

`Object.assign()` 方法仅复制自身可枚举属性,不包括自身不可枚举属性。这是它的核心规则。泛指性不是访问权限问题,而是决定这个属性是否应该被常规遍历和复制的问题。理解这一点,就能预测 `Object.assign()` 复制什么、遗漏什么。

什么是可枚举属性?

每个对象属性都有一个 enumerable 描述符(布尔值)。为 true 时,该属性会在以下场景中出现:

  • for...in 循环
  • Object.keys()
  • JSON.stringify()
  • Object.assign()

为 false 时,这些操作都“视而不见”——但你仍能直接通过点号或方括号读写它,比如 obj.hiddenProp 是完全合法的。

Object.assign 明确跳过的两类属性

它只处理“自身 + 可枚举”的属性,其余一律忽略:

  • 原型链上的属性:即使可枚举,也不拷贝。例如用 Object.create({ inherited: 1 }) 创建的对象,inherited 不会进目标对象。
阅读全文

本文共计572个文字,预计阅读时间需要3分钟。

枚举性如何决定Object.assign拷贝结果的本质差异?

`Object.assign()` 方法仅复制自身可枚举属性,不包括自身不可枚举属性。这是它的核心规则。泛指性不是访问权限问题,而是决定这个属性是否应该被常规遍历和复制的问题。理解这一点,就能预测 `Object.assign()` 复制什么、遗漏什么。

什么是可枚举属性?

每个对象属性都有一个 enumerable 描述符(布尔值)。为 true 时,该属性会在以下场景中出现:

  • for...in 循环
  • Object.keys()
  • JSON.stringify()
  • Object.assign()

为 false 时,这些操作都“视而不见”——但你仍能直接通过点号或方括号读写它,比如 obj.hiddenProp 是完全合法的。

Object.assign 明确跳过的两类属性

它只处理“自身 + 可枚举”的属性,其余一律忽略:

  • 原型链上的属性:即使可枚举,也不拷贝。例如用 Object.create({ inherited: 1 }) 创建的对象,inherited 不会进目标对象。
阅读全文