javascript - JavaScript 模板字面量是否保证调用 toString()?

标签 javascript language-lawyer tostring template-literals

const num = 42
const str = `My number is ${num}`
在这段代码中,我对 num 的转换有什么保证?到 string ?
是否保证只调用它的toString()方法还是可以通过其他方式进行转换?

最佳答案

未标记的模板使用 ECMAScript ToString()抽象操作。模板文字评估的逻辑分布在几个部分,很难理解,所以我只发布一个链接:https://tc39.es/ecma262/#sec-template-literals-runtime-semantics-evaluation
ToString(argument) 使用表格而不是算法步骤,所以我将在这里写出一些伪代码:

switch (Type(argument)) {
  case 'Undefined':
    return 'undefined';
  case 'Null':
    return 'null';
  case 'Boolean':
    return argument ? 'true' : 'false';
  case 'Number':
    return Number::toString(argument);
  case 'String':
    return argument;
  case 'Symbol':
    throw new TypeError();
  case 'BigInt':
    return BigInt::toString(arugment);
  case 'Object':
    return ToString(ToPrimitive(argument, 'string'));
}
如您所见,对于原始值根本不会发生 js 执行,引擎在内部创建了一个字符串表示。对于对象,我们进入 ToPrimitive()算法。
ToPrimitive(input, PreferredType) 将尝试获取 Symbol.toPrimitive来自 input 的方法, 如果它存在,用给定的 PreferredType 调用它暗示。如果 input没有 Symbol.toPrimitive属性,它回退到 OrdinaryToPrimitive .
OrdinrayToPrimitive(O, hint) 将尝试调用toStringvalueOf方法。如果 hint'string' ,它会尝试调用 toString方法优先,否则会尝试调用 valueOf先说方法。如果存在这些方法中的任何一个并且它们不返回对象,则将使用它们的返回值。如果两者都不存在或者它们都返回对象,则会抛出 TypeError。
所以要回答你原来的问题,转换 42不会调用任何其他方法。引擎将在内部创建一个字符串表示('42'),并使用它。

关于javascript - JavaScript 模板字面量是否保证调用 toString()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62516921/

相关文章:

javascript - 从页面顶部滚动之前页面会闪烁到 anchor

javascript - 使用dispatch()时没有调用Reducer

c++ - Qt 是符合标准的 C++ 实现吗?

c++ - 在没有警告/错误的情况下对引用进行隐式重新解释

c++ - 在类内部,为什么 `auto b() -> decltype(a()) {}` 有效,但 `decltype(a()) b() {}` 无效?

java - 可变参数构造函数的 toString 方法

javascript - html dom 添加 javascript 函数

javascript - 如何使用 Jquery 或 Javascript 将 UTF-8 字母替换为类似的拉丁字母

java - 如何打印出一个字符串,其中数组的每个元素为四行

Java arraylist转数组、数组转字符串错误