为什么Node.js控制台不显示含自有属性的非空对象内容?
为什么Chrome和Node.js控制台打印Object.create创建的对象输出不同?
先看你的示例代码:
const wolf = { type: 'canine', } const pug = Object.create(wolf, { size: { value: 's' } }); console.log(pug.hasOwnProperty('size')); // true
Chrome控制台输出:{size: 's'},而Node.js 19.0.0控制台输出:{},差异的核心原因在于属性可枚举性和控制台的打印逻辑差异:
1. size属性默认是不可枚举的
使用Object.create()的第二个参数定义属性时,每个属性描述符的默认配置是:
writable: falseenumerable: falseconfigurable: false
也就是说,你定义的size确实是pug的自身属性(所以hasOwnProperty返回true),但它是不可枚举的。可以通过以下代码验证:
console.log(Object.getOwnPropertyDescriptors(pug)); // 输出:{ size: { value: 's', writable: false, enumerable: false, configurable: false } }
2. 控制台打印逻辑不同
- Chrome DevTools:控制台在展示对象时,会列出对象自身的所有属性,无论属性是否可枚举,因此能看到
size。 - Node.js:
console.log()内部依赖util.inspect()来格式化输出,而util.inspect()默认只显示对象的可枚举自身属性。由于size不可枚举,所以打印结果为{}。
验证与统一输出的方法
如果想让Node.js控制台也显示size,只需在定义属性时显式设置enumerable: true:
const pug = Object.create(wolf, { size: { value: 's', enumerable: true } });
此时Chrome和Node.js的控制台都会输出{size: 's'}。
另外,在Node.js中若要查看对象的所有自身属性(包括不可枚举的),可以使用Object.getOwnPropertyNames():
console.log(Object.getOwnPropertyNames(pug)); // 输出:['size']
内容的提问来源于stack exchange,提问作者devope
相关产品推荐
相关产品推荐

