我是一名有用的助手,可以为您翻译文本。
我遇到了一个情况,其中JavaScript字符串插值与字符串连接不会产生相同的结果。
以下是显示差异的简化代码版本:
然而,当我尝试使用 Date 对象进行此操作时(它的
我的问题是:当使用串联和插值时,插值的值如何转换为字符串的实际规则是什么,为什么Date对象似乎与其他对象不同?(我尝试查找了解这个问题,但目前为止我的搜索没有成功...) JSFiddle示例
我遇到了一个情况,其中JavaScript字符串插值与字符串连接不会产生相同的结果。
以下是显示差异的简化代码版本:
const mmt = moment();
console.log('concatenated: ' + mmt); // "concatenated: 1651070909974"
console.log(`interpolated: ${mmt}`); // "interpolated: Wed Apr 27 2022 10:48:29 GMT-0400"
console.log('mmt.valueOf(): ' + mmt.valueOf()); // "mmt.valueOf(): 1651070909974"
console.log('mmt.toString(): ' + mmt.toString()); // "mmt.toString(): Wed Apr 27 2022 10:48:29 GMT-0400"
所以我立即想到这是由于 .toString()
和 .valueOf()
的差异造成的,因此我制作了一个小测试对象来验证:
const obj = {
toString: () => 'toString',
valueOf: () => 'valueOf',
};
console.log('concatenated: ' + obj); // "concatenated: valueOf"
console.log(`interpolated: ${obj}`); // "interpolated: toString"
console.log('obj.valueOf(): ' + obj.valueOf()); // "obj.valueOf(): valueOf"
console.log('obj.toString(): ' + obj.toString()); // "obj.toString(): toString"
然而,当我尝试使用 Date 对象进行此操作时(它的
.toString()
和 .valueOf()
的结果也不同),我并没有得到相同的行为——这次插值和连接都使用了 .toString()
的值:const dte = new Date();
console.log('concatenated: ' + dte); // "concatenated: Wed Apr 27 2022 10:48:29 GMT-0400 (Eastern Daylight Time)"
console.log(`interpolated: ${dte}`); // "interpolated: Wed Apr 27 2022 10:48:29 GMT-0400 (Eastern Daylight Time)"
console.log('dte.valueOf(): ' + dte.valueOf()); // "dte.valueOf(): 1651070909974"
console.log('dte.toString(): ' + dte.toString()); // "dte.toString(): Wed Apr 27 2022 10:48:29 GMT-0400 (Eastern Daylight Time)"
我的问题是:当使用串联和插值时,插值的值如何转换为字符串的实际规则是什么,为什么Date对象似乎与其他对象不同?(我尝试查找了解这个问题,但目前为止我的搜索没有成功...) JSFiddle示例
.toPrimitive
,所以我的所有搜索都没有找到它。 - Kip[Symbol.toPrimitive]
,而不是.toPrimitive
。 - Mulan