ES6什么时候使用String.raw默认模板文字

问题描述:

我想连接一串字符串以在Javascript中构建查询字符串。以前我已经经历了丑陋的字符串连接来实现这一点:ES6什么时候使用String.raw默认模板文字

var queryString = "?action=" + actionValue + "&data=" + dataValue"; 

但随着ES6我看到有提供了新的方法,可以帮助我达到同样的效果有多大更好看的代码,就像在C#6 字符串插值:

string s = $"action={actionValue}&data={dataValue}" 

我有两个默认模板文字和String.raw,虽然每个命令的语法略有不同,他们都工作进行测试。我倾向于在我的最终副本中使用String.raw,因为它不允许字符串被标记,因此将来像缺省模板文字一样被修饰。

虽然它说,在MDN docsString.raw基本上调用默认模板文字的方法,但我喜欢的String.raw更好的语法...我打电话我串的花括号,我格式化,所以也许里面的String.join方法那是String.raw的误用。

是否有任何ES6向导能够启发我,并为其中一个提供理由?

我的代码:

var defaultTemplateStringUrl = `@Url.Action("DownloadMultiple")?inIds=${inData.join(',')}&outIds=${outData.join(',')}&truckId=${truckId}`; 
var rawStringUrl = String.raw `@Url.Action("DownloadMultiple")?inIds=${inData.join(',')}&outIds=${outData.join(',')}&truckId=${truckId}`; 

window.open(/*url goes here*/); 
+1

到底是如何使用'String.raw'使用?你是否将它称为函数?这似乎很不方便。 –

+1

我对你的问题有点困惑。你不能只是'var queryString = \'?action = $ {actionValue}&data = $ {dataValue} \';'? –

+0

你为什么要原始字符串?你所要做的就是使用一个标签,它在每个插值上调用'encodeURIComponent'。 – Bergi

不,使用String.raw对您没有任何意义。

您应该编写自己的模板标签,以便以您喜欢的方式进行必要的URL编码和处理数组。

function myUrl(parts) { 
    var url = parts[0]; 
    for (var i=1; i<arguments.length; i++) { 
     var val = arguments[i]; 
     if (Array.isArray(val)) 
      val = val.join(","); 
     url += encodeURIComponent(val); 
     url += parts[i]; 
    } 
    return url; 
} 

然后你就可以

window.open(myUrl`@Url.Action("DownloadMultiple")?inIds=${inData}&outIds=${outData}&truckId=${truckId}`); 
+0

感谢您的帮助@Bergi和其他人。 –

+0

'url'虽然是一个数组... –

+0

@FelixKling:'parts'是,'url'是一个字符串 – Bergi

模板文字产生一个字符串。如果你使用String.raw,你会得到该字符串的原始形式:

`a\tb`;   // "a b" 
String.raw`a\tb`; // "a\tb" 

所以,你应该用String.raw只有当你想要的原始形式。

+0

Nit:“模板文字” –

+0

啊我看到了,我应该使用模板文字方法,而不是String.raw来防止URL被正确编码。 –