首页 > 解决方案 > 当 toString 或 valueOf 都不返回堆栈时,console.log 如何获取错误堆栈?

问题描述

(new Error('test')).toString() // 'Error: test'

(new Error('test')).valueOf() // Error('test')

(new Error('test')).stack // 'Error: test\n at <anonymous>:1:2'

console.log(new Error('test')) // Prints 'Error: test\n at <anonymous>:1:2'

显然,console.log正在获取堆栈。

Error.prototype.toString = () => 'toString';
Error.prototype.valueOf = () => 'valueOf';
const err = new Error('test');
err.stack = 'stack';

console.log(err); // Prints 'stack'

为什么会console.log得到堆栈?一个相关的问题是,为什么不Error.prototype.toString返回堆栈?console.log以不同方式处理Error对象似乎是一个复杂的设计。

另外,这样的东西是否记录在某处?它似乎不在这里:https ://console.spec.whatwg.org/

标签: javascript

解决方案


每个浏览器都以不同的方式实现 console.log。例如,console.log(new Error('test'))在 Safari 中打印undefined;所以这真的取决于浏览器供应商他们想要如何实现它。

但是,该Error对象实现了一个toString属于 ECMAScript 规范的方法,因此浏览器必须遵守该规范:https ://www.ecma-international.org/ecma-262/5.1/#sec-15.11.4.4


推荐阅读