繁体   English   中英

当toString或valueOf都不返回堆栈时,console.log如何获取错误的堆栈?

[英]How does console.log get an error's stack when neither toString or valueOf return the stack?

(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/

每个浏览器以不同的方式实现console.log。 例如,Safari中的console.log(new Error('test'))打印undefined 因此,真正由浏览器供应商决定如何实现它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM