javascript的创建多行字符串的7种方法


Posted in Javascript onApril 29, 2014

JS里并没有标准的多行字符串的表示方法,但是在用模板的时候,为了保证模板的可阅读性,我们又不可避免的使用多行字符串,所以出现了各种搞法,这里以一段jade的模板作为示例,简单总结和对比一下。

一、字符串相加

这是最容易理解也很常用的一种形式,如下

var tmpl =''+
    '!!! 5' +
    'html' +
    '  include header' +
    '  body' +
    '    //if IE 6' +
    '        .alert.alert-error' +
    '            center 对不起,我们不支持IE6,请升级你的浏览器' +
    '                a(href="http://windows.microsoft.com/zh-CN/internet-explorer/download-ie") | IE8官方下载' +
    '                a(href="https://www.google.com/intl/en/chrome/browser/") | Chrome下载' +
    '    include head' +
    '    .container' +
    '        .row-fluid' +
    '            .span8' +
    '                block main' +
    '                include pagerbar' +
    '            .span4' +
    '                include sidebar' +
    '    include footer' +
    '    include script'

优点:

易理解,简单,可靠
足够灵活,可以在单个字符串中添加js逻辑

缺点 :

并不是真正意义上的多行字符串, 如果想要真正的多行,需要自己加\n
大量的+号看上去满天星,大量的'和", 丑陋

二、使用反斜线

这个叫续行符, 这个并非一种很常见的方式, 但是一旦用上了,还是很容易上瘾,只需要加一个字符

var tmpl ='\
    !!! 5\
    html\
      include header\
      body\
        //if IE 6\
            .alert.alert-error\
                center 对不起,我们不支持IE6,请升级你的浏览器\
                    a(href="http://windows.microsoft.com/zh-CN/internet-explorer/download-ie") | IE8官方下载\
                    a(href="https://www.google.com/intl/en/chrome/browser/") | Chrome下载\
        include head\
        .container\
            .row-fluid\
                .span8\
                    block main\
                    include pagerbar\
                .span4\
                    include sidebar\
        include footer\
        include script'

优点:

简单,每一行只需要有多一个\
高效!在大部分的浏览器上,这种方式都是最快的,

缺点 :

致命缺陷,每一行的\必须不可以有空格,否则直接脚本错误
并不是真正意义上的多行字符串, 如果想要真正的多行,需要自己加\n
尽管绝大部分的js引擎都支持它,但是它并不是ECMAScript的一部分

三、字符串数组join

var tmpl = [
    '!!! 5' ,
    'html' ,
    '  include header' ,
    '  body' ,
    '    //if IE 6' ,
    '        .alert.alert-error' ,
    '            center 对不起,我们不支持IE6,请升级你的浏览器' ,
    '                a(href="http://windows.microsoft.com/zh-CN/internet-explorer/download-ie") | IE8官方下载' ,
    '                a(href="https://www.google.com/intl/en/chrome/browser/") | Chrome下载' ,
    '    include head' ,
    '    .container' ,
    '        .row-fluid' ,
    '            .span8' ,
    '                block main' ,
    '                include pagerbar' ,
    '            .span4' ,
    '                include sidebar' ,
    '    include footer' ,
    '    include script'].join('\n');

优点:

真正意义上的多行字符串
易理解,简单,可靠
足够灵活,可以在单个字符串中添加js逻辑

缺点 :

大量的,号和'、", 丑陋

五、String.prototype.concat

var tmpl = String.prototype.concat.call(
    '!!! 5' ,
    'html' ,
    '  include header' ,
    '  body' ,
    '    //if IE 6' ,
    '        .alert.alert-error' ,
    '            center 对不起,我们不支持IE6,请升级你的浏览器' ,
    '                a(href="http://windows.microsoft.com/zh-CN/internet-explorer/download-ie") | IE8官方下载' ,
    '                a(href="https://www.google.com/intl/en/chrome/browser/") | Chrome下载' ,
    '    include head' ,
    '    .container' ,
    '        .row-fluid' ,
    '            .span8' ,
    '                block main' ,
    '                include pagerbar' ,
    '            .span4' ,
    '                include sidebar' ,
    '    include footer' ,
    '    include script');

优点:

不常用,事实上字符串的concat方法远没有+号常见
易理解,简单,可靠
足够灵活,可以在单个字符串中添加js逻辑

缺点 :

并不是真正意义上的多行字符串
大量的,号和'、", 丑陋

五、heredoc

这是一种很有技巧的解决办法, 利用了function的toString方法

function heredoc(fn) {
    return fn.toString().split('\n').slice(1,-1).join('\n') + '\n'
}
var tmpl = heredoc(function(){/*
    !!! 5
    html
      include header
      body
        //if IE 6
            .alert.alert-error
                center 对不起,我们不支持IE6,请升级你的浏览器
                    a(href="http://windows.microsoft.com/zh-CN/internet-explorer/download-ie") | IE8官方下载
                    a(href="https://www.google.com/intl/en/chrome/browser/") | Chrome下载
        include head
        .container
            .row-fluid
                .span8
                    block main
                    include pagerbar
                .span4
                    include sidebar
        include footer
        include script
 */});

优点:

模板字符串内不必写多余的任何字符,干净,简单
真正意义上的多行字符串, 有\n哦

缺点 :

不可以在单个字符串中添加js逻辑
容易被压缩器压缩掉,yui compressor可以通过/*!来避免被压缩掉,uglifyjs和gcc也可以通过选项配置不删除特定的注释,这个不是大问题

六、coffeescript

相当于换了一个语言,其实这种语言上缺少的功能,通过coffeescript这种以js为编译目标的语言来实现是一种非常棒的选择。

var tmpl = """ 
    !!! 5
    html
      include header
      body
        //if IE 6
            .alert.alert-error
                center 对不起,我们不支持IE6,请升级你的浏览器
                    a(href="http://windows.microsoft.com/zh-CN/internet-explorer/download-ie") | IE8官方下载
                    a(href="https://www.google.com/intl/en/chrome/browser/") | Chrome下载
        include head
        .container
            .row-fluid
                .span8
                    block main
                    include pagerbar
                .span4
                    include sidebar
        include footer
        include script
    """

优点:

易理解,简单,可靠

缺点 :

需要了解coffeescript
整个文件都需要用coffeescript来写

七、ES6

ES6的有一个新的特性,Template Strings, 这是语言层面上第一次实现了多行字符串, 在chrome canary里打开Enable Experimental JavaScript就可以使用这个特性,另外typescript也会支持这种方式

var tmpl = 
   `!!! 5
    html
      include header
      body
        //if IE 6
            .alert.alert-error
                center 对不起,我们不支持IE6,请升级你的浏览器
                    a(href="http://windows.microsoft.com/zh-CN/internet-explorer/download-ie") | IE8官方下载
                    a(href="https://www.google.com/intl/en/chrome/browser/") | Chrome下载
        include head
        .container
            .row-fluid
                .span8
                    block main
                    include pagerbar
                .span4
                    include sidebar
        include footer
        include script`

优点:

易理解,原生支持
真正的多行字符串

缺点 :
JS引擎支持有限

八、总结

看了这么些写法,如何选择?如果你用的是coffeescript,放心大胆的使用它支持的多行字符串写法;如果是在客户端,同时你解决了你的压缩器去掉注释的问题,推荐使用heredoc;如果你无法解决压缩器的问题,使用反斜线连接吧,每行只需要加一个字符。

Javascript 相关文章推荐
浅谈JavaScript中面向对象技术的模拟
Sep 25 Javascript
node.js中的fs.fstatSync方法使用说明
Dec 15 Javascript
使用jquery.qrcode.js生成二维码插件
Oct 17 Javascript
scroll事件实现监控滚动条并分页显示(zepto.js)
Dec 18 Javascript
JS实现最简单的冒泡排序算法
Feb 15 Javascript
jQuery dateRangePicker插件使用方法详解
Jul 28 jQuery
Vue项目全局配置微信分享思路详解
May 04 Javascript
JavaScript控制浏览器全屏显示简单示例
Jul 05 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
Aug 25 Javascript
详解基于iview-ui的导航栏路径(面包屑)配置
Feb 22 Javascript
解决Layui中layer报错的问题
Sep 03 Javascript
vue通过接口直接下载java生成好的Excel表格案例
Oct 26 Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
Apr 29 #Javascript
当某个文本框成为焦点时即清除文本框内容
Apr 28 #Javascript
JS实现两个大数(整数)相乘
Apr 28 #Javascript
关于img的href和src取变量及赋值的方法
Apr 28 #Javascript
php和js对数据库图片进行等比缩放示例
Apr 28 #Javascript
JS计算网页停留时间代码
Apr 28 #Javascript
js分页代码分享
Apr 28 #Javascript
You might like
使用PHP实现蜘蛛访问日志统计
2013/07/05 PHP
PHP APC配置文件2套和参数详解
2014/06/11 PHP
destoon数据库表说明汇总
2014/07/15 PHP
PHP编程计算两个时间段是否有交集的实现方法(不算边界重叠)
2017/05/30 PHP
来自qq的javascript面试题
2010/07/24 Javascript
javascript SpiderMonkey中的函数序列化如何进行
2012/12/05 Javascript
JS设置获取cookies的方法
2014/01/26 Javascript
js判断变量初始化的三种形式及推荐用的形式
2014/07/22 Javascript
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
JQuery.validationEngine表单验证插件(推荐)
2016/12/10 Javascript
js+html5实现半透明遮罩层弹框效果
2020/08/24 Javascript
ES6中Array.includes()函数的用法
2017/09/20 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
2019/01/20 Javascript
JavaScript碎片—函数闭包(模拟面向对象)
2019/03/13 Javascript
layer.alert自定义关闭回调事件的方法
2019/09/27 Javascript
[01:28:24]NAVI vs VG Supermajor 败者组 BO3 第三场 6.5
2018/06/06 DOTA
python3+mysql查询数据并通过邮件群发excel附件
2018/02/24 Python
python批量设置多个Excel文件页眉页脚的脚本
2018/03/14 Python
Python实现动态添加属性和方法操作示例
2018/07/25 Python
解决Python plt.savefig 保存图片时一片空白的问题
2019/01/10 Python
实例讲解Python中浮点型的基本内容
2019/02/11 Python
11个Python3字典内置方法大全与示例汇总
2019/05/13 Python
html+css实现自定义图片上传按钮功能
2019/09/04 HTML / CSS
英文简历中的自我评价用语
2013/12/09 职场文书
市场营销毕业生自荐信范文
2014/04/01 职场文书
我的大学生活演讲稿
2014/04/25 职场文书
运动会演讲稿300字
2014/08/25 职场文书
一份恶作剧的检讨书
2014/09/13 职场文书
国家机关领导干部民主生活会对照检查材料思想汇报
2014/09/17 职场文书
收款授权委托书
2014/10/02 职场文书
委托公证书样本
2015/01/23 职场文书
招商银行工作证明
2015/06/17 职场文书
小学见习报告
2015/06/23 职场文书
小学六年级班主任工作经验交流材料
2015/11/02 职场文书
教师纪律作风整顿心得体会
2016/01/23 职场文书
小程序与后端Java接口交互实现HelloWorld入门
2021/07/09 Java/Android