• javascript的replace+正则 实现ES6的字符串模版


    采用拼接字符串的形式,将 JSON 数据嵌入 HTML 中。开始时代码量较少,暂时还可以接受。但当页面结构复杂起来后,其弱点开始变得无法忍受起来:

    • 书写不连贯。每写一个变量就要断一下,插入一个 + 和 “。十分容易出错。

    • 无法重用。HTML 片段都是离散化的数据,难以对其中重复的部分进行提取。

    • 无法很好地利用 标签。这是 HTML5 中新增的一个标签,标准极力推荐将 HTML 模板放入 标签中,使代码更简洁。

    replace+正则实现

    项目刚开始用的数据拼接

         function formatString() {
            if (arguments.length === 0)
                return null;
            var str = arguments[0];
            for (var i = 1; i < arguments.length; i++) {
                var re = new RegExp('\{' + (i - 1) + '\}', 'gm');
                str = str.replace(re, arguments[i]);
            }
            return str;
        },

    第一个参数为需要渲染的数据模板,其他参数为数据:

    formatString('{0},My name is {1}', 'everyMan', '吴孔云')

    这种后期维护较麻烦,一旦更改顺序,都需要更改~~就跟函数需要接收一大串参数一样,我们尽量写成对象的形式,

    var myObject = maker(f,l,m,c,s);//不建议写法
    
    var myObject = maker({//建议写法
         first : f,
         last: l,
         state:s,
         city:c
    });

    在网上搜索看到一个例子,可以类似实现ES6的字符串模版形式,博客是一个高中生写的,戳链接

    function render(template, context) {
    
        //被转义的的分隔符 { 和 } 不应该被渲染,分隔符与变量之间允许有空白字符
        var tokenReg = /(\)?{([^{}\]+)(\)?}/g;
    
        return template.replace(tokenReg, function (word, slash1, token, slash2) {
            //如果有转义的{或}替换转义字符
            if (slash1 || slash2) {  
                return word.replace('\', '');
            }
    
            // 切割 token ,实现级联的变量也可以展开
            var variables = token.replace(/s/g, '').split('.'); 
            var currentObject = context;
            var i, length, variable;
    
            for (i = 0, length = variables.length; i < length; ++i) {
                variable = variables[i];
                currentObject = currentObject[variable];
                // 如果当前索引的对象不存在,则直接返回空字符串。
                if (currentObject === undefined || currentObject === null) return '';
            }
            return currentObject;
        })
    }
    
    String.prototype.render = function (context) {
        return render(this, context);
    };
    
    "{greeting}! My name is { author.name }.".render({
        greeting: "Hi",
        author: {
            name: "hsfzxjy"
        }
    });
    // Hi! My name is hsfzxjy.

    扩展:ES6字符串模版API

    ES6引入了一种新型的字符串字面量语法,我们称之为模板字符串(template strings)。除了使用反撇号字符 ` 代替普通字符串的引号 ’ 或 ” 外,它们看起来与普通字符串并无二致。

    var a = 'kenny'
    `my name is ${a}` //"my name is kenny"

    可以用bable编译成ES5。

  • 相关阅读:
    Exection throws和throw
    Exection(二)
    JAVA-Exception
    IDEA初见---输出HelloWorld,并打包成jar包
    Centos6.5安装Tomcat
    Centos6.5下装ZooKeeper
    LInux下装jdk
    python作业高级FTP
    tcp黏包
    计算器
  • 原文地址:https://www.cnblogs.com/wkyseo/p/5880893.html
Copyright © 2020-2023  润新知