我想知道为什么在这种情况下模板字符串会产生[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/

10-09 18:23