gpt4 book ai didi

javascript - 将 javascript 错误转换为字符串的区别

转载 作者:行者123 更新时间:2023-12-05 03:22:46 25 4
gpt4 key购买 nike

我正在重构一些代码,我想确保我没有遗漏任何边缘情况。我不知道我是否了解模板文字的所有细节。

是否存在这三个日志消息不同的合理情况?

try {
throw new Error('test error');
} catch (error) {
console.log(`sample error message: ${error.toString()}`)
console.log(`sample error message: ${String(error)}`)
console.log(`sample error message: ${error}`);
}

最佳答案

如果您遵循始终抛出 Error 实例的良好做法,那么您可以合理地假设它们将始终相同。即使您不遵循这种良好做法,它们的行为也可能相同。需要一些奇怪的技巧才能使它们表现不同。

这是一个示例,我在其中创建了一个 null-prototype object (所以它没有默认的 toString() 方法),然后我提供了一个 valueOf()对此对象的定义并将其抛出。如果 toString() 不存在,字符串强制将回退到使用 valueOf(),因此前两个日志有效。最后一个不会,因为它明确尝试使用不存在的 toString() 函数。

try {
const err = Object.create(null);
err.valueOf = () => 42;
throw err;
} catch (error) {
console.log(`sample error message: ${String(error)}`);
console.log(`sample error message: ${error}`);
console.log(`sample error message: ${error.toString()}`);
}

要进一步阅读,我会查看 this section of MDN's toString page .它似乎暗示使用 String(value)'' + value 行为相同(使用模板字符串的强制也与字符串连接行为相同),虽然我需要检查 JavaScript 规范才能 100% 确定这一点。特别是,听起来这两个都将调用 toString(),除非这个 Symbol.toPrimitive函数是在对象上定义的,在这种情况下,它具有更高的优先级。

一般来说,如果您在 String(error) 之间交换并将字符串与您的值连接起来,这似乎是最安全的。使用 .toString() 的区别最大,因为它不会考虑 Symbol.toPrimitivevalueOf() 的潜在存在转换时。

关于javascript - 将 javascript 错误转换为字符串的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72637599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com