gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:59:02 25 4
gpt4 key购买 nike

环境:nodejs 8.1.5,也在 jscomplete 上测试,结果相同

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

rest 对象原来不包含 stack 属性,因为 Object.keys 不返回它并且“for in”不会拾取它。然而,它是错误对象的自有属性(hasStack 在上面为真)。

什么给了?我在文档或 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys 上的 polyfill 中找不到任何关于特殊外壳此属性的信息

最佳答案

它不可枚举,所以它不会包含在 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 上,这两个属性是原型(prototype)上的 getter,而不是直接在 error 对象上。 (原型(prototype)除了stackmessage还有其他属性)

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

关于javascript - 为什么 Error 的堆栈属性不包含在 Object.keys 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58706784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com