没有括号的函数返回一个奇怪的输出

Rez*_*ati 8 javascript

只是想了解它是如何工作的:

function say(something) {
  return something;
}
let name = `Reza`;

console.log(say `My name is`, name, '!');
Run Code Online (Sandbox Code Playgroud)

它返回一个非常奇怪的输出.我认为这My name is是一个数组中的字符串,其他一切只是一个字符串(如果我错了,请纠正我).

我的问题是,有什么意义,何时使用这样的函数是有意义的?

如果有人能告诉我为什么My name is ${name}不工作(name返回为空字符串),我也会很高兴.

PS:我知道可以使用带括号的函数,它可以工作,但这不是我的问题.

Ngu*_*You 8

为什么我的名字是$ {name}不起作用(名称返回为空字符串).

这是因为你必须My name is字符串值数组中提取并返回它

试试这个:

function say(something) {
   var str0 = something[0]
   return str0;
}
let name = `Reza`;
console.log(say`My name is${name}`, name, '!');  // My name is Reza !
Run Code Online (Sandbox Code Playgroud)

我们会收到这样的东西:

在此输入图像描述

我想指出这${name}并不意味着什么,因为在内部tag function,我们没有做任何事情.

这是在Chrome devtools上运行代码后的结果:

在此输入图像描述

让我们看看我们如何解释实际发生的事情.那么,你正在使用的是Tagged templates:

更高级的模板文字形式是标记模板.标签允许您使用函数解析模板文字.标记函数的第一个参数包含一个字符串值数组.

这就是我们array在结果中看到的原因:

例如,如果我们在Chrome devtools上运行此代码:

function say(something) {
    return something;
}
console.log(say`anything`);
Run Code Online (Sandbox Code Playgroud)

在控制台选项卡上,我们将收到以下结果:

在此输入图像描述

有关更多信息,请在此处阅读:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#Tagged_templates

正如我们所看到的,奇怪的raw属性,根据MDN - Raw字符串,它是:

特殊原始属性(在标记模板的第一个函数参数上可用)允许您在输入时访问原始字符串,而无需处理转义序列.

例如:

function tag(strings) {
  console.log(strings.raw[0]);
}

tag`string text line 1 \n string text line 2`;
// logs "string text line 1 \n string text line 2" ,
// including the two characters '\' and 'n'
Run Code Online (Sandbox Code Playgroud)

你正在使用console.log()方法,根据MDN-Console.log()我们有它的签名:

语法:Console.log()

console.log(obj1 [,obj2,...,objN]);

console.log(msg [,subst1,...,substN]);

参数

obj1 ... objN

要输出的JavaScript对象列表.每个对象的字符串表示按列出和输出的顺序附加在一起.

msg

包含零个或多个替换字符串的JavaScript字符串.

subst1 ... substN

用于替换msg中的替换字符串的JavaScript对象.这使您可以对输出格式进行额外控制.

在您的情况下,您将多个参数传递给Console.log()方法,因此它将像文档中所述那样工作:输出多个对象

在此输入图像描述