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