[英]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.