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)
将尝试调用toString
和 valueOf
方法。如果 hint
是 'string'
,它会尝试调用 toString
方法优先,否则会尝试调用 valueOf
先说方法。如果存在这些方法中的任何一个并且它们不返回对象,则将使用它们的返回值。如果两者都不存在或者它们都返回对象,则会抛出 TypeError。所以要回答你原来的问题,转换
42
不会调用任何其他方法。引擎将在内部创建一个字符串表示('42'
),并使用它。
关于javascript - JavaScript 模板字面量是否保证调用 toString()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62516921/