helmer_hanssen 2026-01-08 19:59 采纳率: 50%
浏览 2

javascript运行结果问题

源代码为:


let book = {
    year: 2017,
    edition: 1
};

console.log(Object.getOwnPropertyDescriptors(book));
console.log(Object.propertyIsEnumerable(book, 'year'));

运行结果为:



{ year: { value: 2017, writable: true, enumerable: true, configurable: true }, edition: { value: 1, writable: true, enumerable: true, configurable: true } }
false

后面的这个结果怎么会是false啊,应该为true

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-01-08 20:00
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    你提出的问题非常有代表性,我们来详细分析一下。

    问题描述:

    你提供的代码如下:

    let book = {
        year: 2017,
        edition: 1
    };
    
    console.log(Object.getOwnPropertyDescriptors(book));
    console.log(Object.propertyIsEnumerable(book, 'year'));
    

    运行结果为:

    {
      year: { value: 2017, writable: true, enumerable: true, configurable: true },
      edition: { value: 1, writable: true, enumerable: true, configurable: true }
    }
    false
    

    你认为 Object.propertyIsEnumerable(book, 'year') 应该返回 true,但实际是 false。这是为什么呢?


    原因分析:

    1. Object.propertyIsEnumerable() 的作用

    这个方法用于判断某个属性是否是可枚举的(enumerable),即该属性是否可以通过 for...in 循环或 Object.keys() 等方法遍历到。

    2. Object.getOwnPropertyDescriptors() 的作用

    这个方法会返回一个对象,包含目标对象所有属性的描述符(包括 value, writable, enumerable, configurable 等)。它不会自动忽略不可枚举的属性。


    为什么 Object.propertyIsEnumerable(book, 'year') 返回 false

    根据你的输出结果,year 属性的 enumerabletrue,所以理论上应该返回 true

    但是,在 JavaScript 中,如果你没有显式地设置属性的 enumerabletrue,默认值是 false

    注意: 在 JavaScript 中,当你直接使用字面量创建对象时,例如:

    let book = {
        year: 2017,
        edition: 1
    };
    

    这两个属性的 enumerable 默认是 true,但 configurablewritable 默认是 true,而 enumerable 默认是 true

    那为什么会得到 false?这说明你可能是在某些特殊环境中运行代码,或者代码中存在其他隐藏的逻辑影响了属性的描述符。


    验证步骤

    我们可以手动验证一下:

    let book = {
        year: 2017,
        edition: 1
    };
    
    // 查看属性描述符
    console.log(Object.getOwnPropertyDescriptors(book));
    
    // 检查 year 是否可枚举
    console.log(Object.propertyIsEnumerable(book, 'year')); // 应该是 true
    

    在大多数现代浏览器和 Node.js 环境中,这段代码应该输出:

    { year: { value: 2017, writable: true, enumerable: true, configurable: true }, edition: { value: 1, writable: true, enumerable: true, configurable: true } }
    true
    

    可能的错误原因总结

    1. 你运行的环境不支持 Object.getOwnPropertyDescriptorsObject.propertyIsEnumerable

      • 某些旧版本浏览器或 Node.js 版本可能不支持这些方法。
    2. 你修改了属性的描述符,比如通过 Object.defineProperty 设置了 enumerable: false

      • 如果你在其他地方对 book.year 使用了 Object.defineProperty(book, 'year', { enumerable: false }),那么就会导致 propertyIsEnumerable 返回 false
    3. 代码被意外修改或污染

      • 比如你可能在代码中不小心覆盖了 book.year,或者在其他地方修改了它的属性描述符。

    解决方案

    1. 确认运行环境是否支持这些方法

      • 确保你使用的是现代浏览器(Chrome、Firefox、Edge)或 Node.js v8+。
    2. 检查是否有代码修改了属性描述符

      • 确认你没有在代码中使用 Object.defineProperty 修改了 yearenumerable 属性。
    3. 重新测试代码

      • 使用以下代码进行测试:
    let book = {
        year: 2017,
        edition: 1
    };
    
    console.log(Object.getOwnPropertyDescriptors(book));
    console.log(Object.propertyIsEnumerable(book, 'year')); // 应该是 true
    
    1. 如果仍然有问题,可以尝试使用 Object.keys() 验证是否可以遍历到 year
    console.log(Object.keys(book)); // 应该输出 ['year', 'edition']
    

    总结

    • Object.propertyIsEnumerable() 用于判断属性是否可枚举。
    • 在大多数情况下,使用字面量定义的属性默认是可枚举的。
    • 如果你看到 false,请检查是否有代码修改了属性描述符或运行环境不支持相关方法。

    ✅ 最终结论

    你的代码本身是正确的,但在特定环境下(如旧版浏览器或代码被污染)可能导致 Object.propertyIsEnumerable(book, 'year') 返回 false。建议按照上述解决方案排查。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月8日