JavaScript中使用if语句连接字符串

29

我尝试编写一个脚本将一些变量连接成一个字符串,如果它们存在的话,以便将适当的元数据标签放入呈现的HTML文档中。

我的连接代码是:

data = "<html>\n<head>\n" + "</head>\n<body>\n\n" + paras.join("\n\n") + "\n\n</body>\n</html>";

我正在尝试像以下这样将if语句添加到其中(在第一个和第二个项目之间):

if (typeof metadata_title !== "undefined") {
    "<title>" + metadata_title + "</title>\n"
}
if (typeof metadata_author !== "undefined") {
    "<meta name=\"author\" content=\"" + metadata_author + "\"></meta>\n"
}
if (typeof metadata_date !== "undefined") {
    "<meta name=\"date\" content=\"" + metadata_date + "\"></meta>\n"
}

但是我无法直接将这些语句添加到连接代码中(会抛出错误:Unexpected token ()。

最好的方法是如何将这样的语句添加到我的连接字符串中?

5个回答

62

我会使用一个三元操作符

data = "<html>\n"
     + "<head>\n" 
     + ( typeof metadata_title  !== "undefined" ?  "<title>" + metadata_title + "</title>\n"                             : "" )
     + ( typeof metadata_author !== "undefined" ?  "<meta name=\"author\" content=\"" + metadata_author + "\"></meta>\n" : "" )
     + ( typeof metadata_date   !== "undefined" ?  "<meta name=\"date\" content=\"" + metadata_date + "\"></meta>\n"     : "" )
     + "</head>\n"
     + "<body>\n"
     + "\n"
     + paras.join("\n\n")
     + "\n"
     + "\n"
     + "</body>\n"
     + "</html>"
;

1
对于这种情况,< 对 typeof 的使用感到困惑。为什么不直接检查 var 是否为 undefined 呢? - Demian Brecht
3
在特殊情况下(var undefined = 'test';)结果可能出错,使用typeof更为安全。 - scessor
如果其中一个变量根本没有定义,您将会收到一个“ReferenceError”错误。我认为这就是OP所想的。当然,如果所有三个元数据都被定义了,那么您的代码就完全没问题。 - Ray Toal

7
data = "<html>\n<head>\n" 
    + (
        typeof metadata_title !== "undefined" ?
        "<title>" + metadata_title + "</title>\n" :
        ""
    )
    + (
        typeof metadata_author !== "undefined" ?
        "<meta name=\"author\" content=\"" + metadata_author + "\"></meta>\n" :
        ""
    )
    + (
        typeof metadata_date !== "undefined" ?
         "<meta name=\"date\" content=\"" + metadata_date + "\"></meta>\n" :
        ""
    )
    + "</head>\n<body>\n\n" 
    + paras.join("\n\n") 
    + "\n\n</body>\n</html>";

5

我可能会做一些不同的事情(更像模板),主要是因为我讨厌用Javascript拼接HTML:

var metadata_title = "Hello";
var metadata_author = "Me";
var metadata_date = "2011-09-07";

var template = "<html>\
            <head>\
                <title>#title#</title>\
                <meta name=\"author\" content=\"#author#\"></meta>\
                <meta name=\"date\" content=\"#date#\"></meta>\
            </head>\
            <body>\
            </body>\
            </html>";

var data = template.replace("#title#", metadata_title != undefined ? metadata_title : "")
                   .replace("#author#", metadata_author != undefined ? metadata_author : "")
                   .replace("#date#", metadata_date != undefined ? metadata_date : "");

当然,这会增加一点点额外的开销,但对我来说,它更易读。

你怎么在这里获取“paras”?(并不难;我只是想看看在没有真正的模板引擎的情况下你会想出什么。干杯。) - Ray Toal
除非我漏掉了什么(现在已经很晚了,我需要睡觉),否则我很可能只是在body标签之间添加#paras#,并像替换其他元素一样进行替换。 join只返回一个字符串,所以我认为它应该可以工作。 - Demian Brecht

1

将整个文档构建成一个数组,然后在末尾使用"\n"进行连接。(当然,这样做的原因是不会散布很多新行!如果您使用的是IE7或更低版本,则Array#join比重复字符串连接要快得多。)

代码:http://jsfiddle.net/ZCbCZ/

更新:我忘记在第一个小提琴中包括"paras"。带有paras的代码在此处:http://jsfiddle.net/U8325/1/

对于那些不想点击并尝试的人,这里是脚本:

// Not going to define metadata_author just to be saved by typeof :-)
var metadata_title = "Hello";
var metadata_date = "2011-09-07";

// Okay 3 paras for fun
var paras = ["<p>paragraph1</p>", "<p>paragraph2</p>", "<p>paragraph3</p>"];

data = ["<html>", "<head>"]

if (typeof metadata_title !== "undefined") {
    data.push("<title>" + metadata_title + "</title>");
}
if (typeof metadata_author !== "undefined") {
    data.push("<meta name=\"author\" content=\"" + metadata_author + "\"></meta>");
}
if (typeof metadata_date !== "undefined") {
    data.push("<meta name=\"date\" content=\"" + metadata_date + "\"></meta>");
}

data.push("</head>");
data.push("<body>");
paras.forEach(function (p) {data.push(p);});   // Requires ES5; use a for-loop if you don't have it
data.push("</body>");
data.push("<html>");
data = data.join("\n");
alert(data);

1

我喜欢Demian Brecht的回答易读性,但我只想用正则表达式替换字符串,因为replace()函数只会替换第一个匹配项(更多信息请参见:JavaScript .replace only replaces first Match

var metadata_title = "Hello";
var metadata_author = "Me";
var metadata_date = "2011-09-07";

var template = "<html>\
            <head>\
                <title>#title#</title>\
                <meta name=\"author\" content=\"#author#\"></meta>\
                <meta name=\"date\" content=\"#date#\"></meta>\
            </head>\
            <body>\
            </body>\
            </html>";

var data = template.replace(/#title#/g, metadata_title != undefined ? metadata_title : "")
                   .replace(/#author#/g, metadata_author != undefined ? metadata_author : "")
                   .replace(/#date#/g, metadata_date != undefined ? metadata_date : "");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接