如何判断一个对象是否为空对象?

推荐答案

-- -------------------- ---- -------
-------- ------------------ -
  -- ---- -- ----- -
    ------ ----- -- ---- - --------- ---- ----
  -
  -- ------- --- --- --------- -
     ------ ------ -- --------------
  -

  --- ---- --- -- ---- -
    -- ------------------- ----- -
       ------ ------ -- --------------
    -
  -
  ------ ----- -- ---------------------
-

本题详细解读

概念理解

“空对象”指的是不包含任何自身属性的对象。原型链上的属性不应被考虑。

常见的错误方法与问题

  1. Object.keys(obj).length === 0

    • 问题: 这种方法可以工作,但如果 objnullundefined ,则会抛出错误。
    • 改进: 需要首先处理 nullundefined 的情况。
    • 代码:
  2. JSON.stringify(obj) === '{}'

    • 问题: 这种方法会忽略 Symbol 属性和值为 undefined 的属性。并且性能较差。
  3. for...in 循环不加hasOwnProperty判断

    • 问题: for...in 会遍历原型链上的属性,造成误判。

推荐方法的原理与优势

  1. if (obj == null) { return true; }

    • 作用: 快速处理 nullundefined ,避免后续错误。
    • 原因: nullundefined 都是假值,可以简单用 == 判等,这样可以同时处理 nullundefined
  2. if (typeof obj !== 'object') { return false; }

    • 作用: 确保传入参数是一个对象,如果传入的是其他的非对象类型,直接返回 false
  3. for (let key in obj) { if (Object.hasOwn(obj, key)) { return false; } }

    • 作用: 遍历 obj 的所有自身属性(不包括原型链上的属性)。
    • Object.hasOwn(obj, key): 判断属性是否是自身属性。hasOwnProperty 的替代方案,避免原型链污染,更加安全可靠。
    • 返回false: 只要找到一个自身属性,就立即返回 false,表示该对象非空。
  4. return true;

    • 作用: 如果循环结束,说明没有找到任何自身属性,则对象为空,返回 true

总结

推荐的 isEmptyObject 函数能正确处理 nullundefined 和各种类型的对象(包括包含 Symbol 属性的对象),且性能较好,具有较高的可靠性。

纠错
反馈