JavaScript模板文本是否保证调用toString()?

JavaScript模板文本是否保证调用toString()?,javascript,language-lawyer,tostring,template-literals,Javascript,Language Lawyer,Tostring,Template Literals,在这段代码中,关于将num转换为字符串,我有什么保证 它保证只调用它的toString()方法,还是可以用另一种方式进行转换?是。如果任一值不是字符串,则将使用常规规则将其转换为字符串。例如,如果action是一个对象,则将调用其.toString()方法 阅读mozilla的完整文章 是的,它是对象原语的函数,如中所述 编辑: ECMA规范为所述的表达式 同样地,在书中写道: 默认函数只是使用ECMAScriptToString()abstract操作将各个部分连接成单个字符串。模板文字求值的

在这段代码中,关于将
num
转换为
字符串
,我有什么保证


它保证只调用它的
toString()
方法,还是可以用另一种方式进行转换?

是。如果任一值不是字符串,则将使用常规规则将其转换为字符串。例如,如果action是一个对象,则将调用其.toString()方法

阅读mozilla的完整文章

是的,它是
对象
原语的函数,如中所述

编辑: ECMA规范为所述的
表达式

同样地,在书中写道:


默认函数只是使用ECMAScript
ToString()
abstract操作将各个部分连接成单个字符串。模板文字求值的逻辑分布在几个部分,因此很难理解,因此我将发布一个链接:

使用表而不是算法步骤,因此我将在这里写出一些伪代码:

开关(类型(参数)){
案例“未定义”:
返回“未定义”;
大小写“Null”:
返回'null';
“布尔”大小写:
返回参数“true”:“false”;
案件编号:
返回编号::toString(参数);
大小写“String”:
返回参数;
案例“符号”:
抛出新的TypeError();
案例“BigInt”:
返回BigInt::toString(arumgint);
案例“对象”:
返回到字符串(ToPrimitive(参数'string');
}
如您所见,对于原语值,根本不会执行js,引擎会在内部创建一个字符串表示。对于对象,我们进入
ToPrimitive()
算法

将尝试从
输入
获取
符号.toPrimitive
方法,如果存在,则使用给定的
首选类型
提示调用该方法。如果
input
没有
Symbol.toPrimitive
属性,则返回到
OrdinaryToPrimitive

将尝试调用
toString
valueOf
方法。如果
hint
'string'
,它将首先尝试调用
toString
方法,否则它将首先尝试调用
valueOf
方法。如果存在这两个方法中的任何一个,并且它们不返回对象,则将使用它们的返回值。如果两者都不存在或都返回对象,则将抛出TypeError


因此,要回答您原来的问题,转换
42
不会调用任何其他方法。引擎将在内部创建一个字符串表示形式(
'42'
),并使用它。

不要忘记带标签的模板-它可能不会!有没有官方的消息来源,比如ECMAScript规范章节?这篇文章看起来更像是一篇博文,确实如此,但谁说它将以模板文本形式调用?@Drax我添加了更多细节这不是问题,问题不是连接,问题是关于非字符串的部分,例如数字,我们如何知道它是用
toString()转换的
方法,而不是以另一种方式?转换始终通过
字符串(num)
完成。这可能会调用
.toString()
,也可能不会,有很多方法。@Bergi如果你有这方面的信息,请写一个答案
const num = 42
const str = `My number is ${num}`