为什么Object.keys中不包含Error的堆栈属性?

时间:2019-11-05 07:53:39

标签: javascript

env:nodejs 8.1.5,也在jscomplete上进行了测试,结果相同

const error = new Error("message");
const { message, ...rest } = error;
const keys = Object.keys(error);
const hasStack = error.hasOwnProperty("stack");

其余对象原来不包括stack属性,因为Object.keys不会返回它,并且“ for in”也不会拾取它。 但是,它是错误对象的自身属性(上面的hasStack是true)。

有什么作用?在文档或https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

上的polyfill中,找不到关于此属性特殊格式的任何信息

1 个答案:

答案 0 :(得分:3)

它不可枚举,因此不会包含在Object.keysfor..in迭代中:

const error = new Error("message");
// For Chrome, it's directly on the object:
console.log(Object.getOwnPropertyDescriptor(error, 'stack'));
// For Firefox, it's a getter on the prototype:
console.log(Object.getOwnPropertyDescriptor(Object.getPrototypeOf(error), 'stack'));

要遍历所有所有属性,包括不可枚举的属性,请改用Object.getOwnPropertyNames

// Chrome:
const error = new Error("message");
Object.getOwnPropertyNames(error).forEach((propName) => {
  console.log(propName);
});

在Firefox上,这两个属性是原型上的吸气剂,而不是直接位于error对象上。 (除stackmessage之外,原型还具有其他属性)

// Chrome:
const error = new Error("message");
Object.getOwnPropertyNames(Object.getPrototypeOf(error)).forEach((propName) => {
  console.log(propName);
});