ES6何时使用String.raw而不是默认的模板文字

ES6 when to use String.raw over default template literal

本文关键字:默认 文字 何时使 String raw ES6      更新时间:2023-09-26

我正在尝试连接一组字符串,以在Javascript中构建查询字符串。以前我已经通过丑陋的字符串连接实现了这一点:

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

但在ES6中,我发现有一些新方法可以帮助我用外观更好的代码实现同样的结果,比如C#中的字符串插值:

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

我已经用默认模板literal和String.raw进行了测试,尽管每种模板的语法略有不同,但它们都能工作。我倾向于在我的最终副本中使用String.raw,因为它不允许对字符串进行标记,因此在未来会像默认模板文本一样进行修改。

虽然MDN文档中确实说String.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*/);

模板文本生成一个字符串。如果您使用String.raw,您将获得该字符串的原始形式:

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

因此,只有当您想要原始表单时,才应该使用String.raw

不,使用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}`);