我想知道为什么在这种情况下模板字符串会产生[object Object]
:
class Omg {}
const omg = new Omg()
Omg.prototype.valueOf = () => 6;
+omg
// 6
omg + ''
// "6"
'' + omg
// "6"
`${omg}`
// "[object Object]"
最佳答案
模板字符串显然使用Object.toString()
来“翻译”其中的占位符(${...}
)。模板字符串是很棒的小野兽;)如果您最好在模板字符串中使用valueOf
,那么tag function
可能是个好主意(请参见代码段和MDN)
class Omg {}
const omg = new Omg()
Omg.prototype.valueOf = () => 6;
console.log(+omg)
console.log(omg + '');
console.log('' + omg);
console.log(`${omg}`);
// note: 7 to demo the tag function
Omg.prototype.toString = () => 7;
console.log(`${omg}`);
// you can use a tag function to force use of valueOf
function useValueOfWherePossible(strings, ...placeHolders) {
let result = strings.raw[0];
for (const [i, phldr] of placeHolders.entries()) {
result += (phldr.valueOf() || phldr) + strings.raw[i + 1];
}
return result;
}
console.log(useValueOfWherePossible `${omg}`);
关于javascript - toPrimitive对模板文字和字符串文字给出不同的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60804857/