每次我实例化一个错误对象时,都有一个.stack
字段。假设构建堆栈跟踪是一项成本高昂的操作,我的自然反应是保留它们用于特殊情况。
但是我记得读到在 v8 中,堆栈跟踪仅在读取.stack
字段时计算。
如果我从未阅读堆栈,我可以假设new Error(...)
和new Object(...)
一样昂贵吗?
这是JS引擎的功能还是标准行为?
>Error.prototype.stack
是一个非标准功能,因此其行为取决于实现。
对于基于 V8 的平台,GitHub 上的 wiki 说:
堆栈跟踪是在创建错误时收集的,并且是相同的 无论错误在何处或引发多少次。
而 Node.js 的文档也说了同样的话:
错误对象捕获详细说明代码中点的"堆栈跟踪" 实例化错误的位置,并可能提供文本 错误说明。
因此,在创建Error
对象时已经收集了它。
但是,直到第一次访问stack
属性时,它才会被格式化,因为同一 wiki 页面上的段落指出:
为了提高效率,堆栈跟踪在捕获时不会格式化 但按需,首次访问堆栈属性时。