代码片段 - JavaScript 字符串模板
/* ------------------------------ // 字符串模板1,语法严格,不能混用,效率相对较高 // 使用 {{ }} 作为标记是为了允许在模板中使用 JSON 字符串 // 用法 1(对象参数,对象可多次调用): var say = "对 象:{{hi}}, {{to}}! {{hello}}, {{world}}!" say = say.format({hi:"Hello", to:"World"}) .format({hello:"你好", world:"世界"}) console.log(say) // 用法 2(数组参数): var say = "数 组:{{0}}, {{1}}! {{0}}!" say = say.format(["Hello", "World"]) console.log(say) // 用法 3(字符串参数,最后一个字符串可以重复使用): var say = "字符串:{{.}}, {{.}}! {{.}}!" say = say.format("Hello", "World") console.log(say) // 用法 4(多次调用,字符串和数组不能共用,字符串必须首先处理): // 无数组 var say = "{{.}}:3 2 1, {{hi}}, {{to}}! {{hello}}, {{world}}!" say = say.format("多 次") .format({hi: "Hello"}) .format({to: "World"}) .format({hello: "你好", world: "世界"}) console.log(say) // 无字符串 var say = "多 次:{{2}} {{1}} {{0}}, {{hi}}, {{to}}! {{hello}}, {{world}}!" say = say.format({hi: "Hello"}) .format({to: "World"}) .format([1,2,3]) .format({hello: "你好", world: "世界"}) console.log(say) // 字符串和数组共用 var say = "{{.}}:{{2}} {{1}} {{0}}, {{hi}}, {{to}}! {{hello}}, {{world}}!" say = say.format("出问题") .format({hi: "Hello"}) .format({to: "World"}) .format([1,2,3]) .format({hello: "你好", world: "世界"}) console.log(say) // 没有首先处理字符串 var say = "出问题:{{.}}, {{hi}}, {{to}}! {{hello}}, {{world}}!" say = say.format({hi: "Hello"}) .format("3 2 1") .format({to: "World"}) .format({hello: "你好", world: "世界"}) console.log(say) ------------------------------ */ String.prototype.format = function(arg) { // 安全检查(长度不能小于 {{.}},为后面下标引用做准备) var len = this.length if (len < 5) { return this } var start = 0, result = "", argi = 0 for (var i=0; i<=len; i++) { // 处理 {{ }} 之外的内容 if (this[i] === "{" && this[i-1] === "{") { result += this.slice(start, i-1) start = i-1 } else if (this[i] === "}" && this[i-1] === "}") { // 获取 {{ }} 中的索引 var index = this.slice(start+2, i-1) if (index === ".") { // 字符串 result += arguments[argi] // 最后一个字符串会重复使用 if (argi < (arguments.length - 1)) { argi++ } start = i+1 } else { // 对象或数组 if (arg[index] != null) { result += arg[index] start = i+1 } } } } // 处理最后一个 {{ }} 之后的内容 result += this.slice(start) return result } /* ------------------------------ // 字符串模板2,语法自由,使用灵活,效率相对较低(基本上模板1就够用了) // 使用 {{ }} 作为标记是为了允许在模板中使用 JSON 字符串 // 用法 1(对象参数,对象可多次提供): var say = "对 象:{{hi}}, {{to}}! {{hello}}, {{world}}!" say = say.template({hi:"Hello", to:"World"}, {hello:"你好"}, {world:"世界"}) console.log(say) // 用法 2(数组参数): var say = "数 组:{{0}}, {{1}}! {{0}}!" say = say.template(["Hello", "World"]); console.log(say) // 用法 3(字符串参数,最后一个字符串可以重复使用): var say = "字符串:{{.}}, {{.}}! {{.}}!" say = say.template("Hello", "World"); console.log(say) // 用法 4(混用,对象、数组、字符串可以在参数的任意位置,对象可多次提供): var say = "{{.}}:{{2}} {{1}} {{0}}, {{hi}}, {{to}}! {{.}}, {{.}}!" say = say.template([1,2,3], "混 用", {hi: "Hello", to: "World"}, "你好", "世界"); console.log(say) // 用法 5(多次调用,字符串参数要一次处理完,对象可多次提供): var say = "{{.}}:{{2}} {{1}} {{0}}, {{hi}}, {{to}}! {{.}}, {{.}}!" say = say.template([1,2,3]) .template({hi: "Hello"}) .template("多 次", "你好", "世界") .template({to: "World"}); console.log(say) ------------------------------ */ String.prototype.template = function() { // 安全检查(长度不能小于 {{.}},为后面下标引用做准备) var len = this.length if (len < 5) { return this } var start = 0, result = "" var objs = [], strs = [], stri = 0 // 参数分类 for (var i in arguments) { switch (typeof arguments[i]) { case "object": objs.push(arguments[i]);break // 对象(包括数组,可以有多个) default : strs.push(arguments[i]) // 其它(当做字符串处理) } } for (var i=0; i<len; i++) { // 处理 {{ }} 之外的内容 if (this[i] === "{" && this[i-1] === "{") { result += this.slice(start, i-1) start = i-1 } else if (this[i] === "}" && this[i-1] === "}") { // 获取 {{ }} 中的索引 var index = this.slice(start+2, i-1) if (index === "." && strs.length > 0) { // 字符串 result += strs[stri] // 最后一个字符串会重复使用 if (stri < strs.length - 1) { stri++ } start = i+1 } else { // 对象或数组 for (var obji in objs) { if (objs[obji][index] != null) { result += objs[obji][index] start = i+1 continue } } } } } // 处理最后一个 {{ }} 之后的内容 result += this.slice(start) return result }
代码片段 - JavaScript 字符串模板的更多相关文章
- JavaScript——字符串——模板字符串
JavaScript--字符串--模板字符串 字符串可以用反引号包裹起来,其中的${expression}表示特殊的含义,JavaScript会将expression代表的变量的值和反引号中的其它普通 ...
- vs _ 用户代码片段 _ html模板
自定义模板:首选项 -> 用户代码片段 - >(如果没有自己创个)html.json t : 表示缩进 n:表示换行 ----------------------------------- ...
- 项目中解决实际问题的代码片段-javascript方法,Vue方法(长期更新)
总结项目用到的一些处理方法,用来解决数据处理的一些实际问题,所有方法都可以放在一个公共工具方法里面,实现不限ES5,ES6还有些Vue处理的方法. 都是项目中来的,有代码跟图片展示,长期更新. 1.获 ...
- HTML代码转换为JavaScript字符串
我有时在工作中用到字符串拼接基本上来自于此,链接 http://www.css88.com/tool/html2js/
- [欣赏代码片段] (JavaScript) 你使用过getComputedStyle没有
(function() { // IE8 ployfill for GetComputed Style (for Responsive Script below) if (!window.getCom ...
- [欣赏代码片段] (JavaScript) Responsive jQuery
jQuery(document).ready(function($) { /* getting viewport width*/ var responsive_viewport = $(window) ...
- vscode 用户代码片段 vue初始化模板 Snippet #新加入开头注释 自动生成文件名 开发日期时间等内容
vue文件模板 模板变量 https://code.visualstudio.com/docs/editor/userdefinedsnippets#_variables vue.json { // ...
- [代码片段]javascript检查图片大小和格式
function checkImgType(input) { var this_ = document.getElementsByName('imgFile')[0]; var filepath = ...
- 代码片段 - JavaScript 求时间差
// 求时间差1(时间差不能超过一天) function timeDifference1(startTime, endTime) { let times = endTime.getTime() - s ...
随机推荐
- 【Siverlight - 扩展篇】Silverlight在OOB模式下实现默认打开最大化
在App.xaml.cs中输入以下代码:在OOB客户端打开,可以实现窗口默认最大化: private void Application_Startup(object sender, Startup ...
- linux下设置SSH无密码登陆
SSH配置 主机cloudgis22.edu.cn:192.168.3.21 主机cloudgis33.edu.cn:192.168.2.174 假设需要配置主机A无密码登录主机A,主机B,先确保所有 ...
- ipython, 一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数
一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数. 若用的是fish s ...
- ZOJ 3810 Pretty Poem 分类: ACM 2015-05-17 14:40 83人阅读 评论(0) 收藏
Pretty Poem Time Limit: 2 Seconds Memory Limit:65536 KB Poetry is a form of literature that uses ...
- spring MVC 如何查找URL对应的处理类
在spring 3.1之前,查找URL相应的处理方法,需要分两步,第一步是调用DefaultAnnotationHandlerMapping,查找到相应的controller类,第二步,再调用Anno ...
- ACM之递推递归
Hdu 2569 突破蝙蝠的包围,yifenfei来到一处悬崖面前,悬崖彼岸就是前进的方向,好在现在的yifenfei已经学过御剑术,可御剑轻松飞过悬崖. 现在的问题是:悬崖中间飞着很多红,黄,蓝三种 ...
- C++视频课程小结(2)
C++远征之离港篇 章节介绍: 每章小结: 第一章:大致讲了一下本章会讲的内容:引用vs指针.const vs #define(这个我在C里都没用过).函数变得更强大.内存管理要小心之类的. 第二章: ...
- Codeforces Round #292 (Div. 1) B. Drazil and Tiles (类似拓扑)
题目链接:http://codeforces.com/problemset/problem/516/B 一个n*m的方格,'*'不能填.给你很多个1*2的尖括号,问你是否能用唯一填法填满方格. 类似t ...
- android 小知识点
小知识点总结 1. android中MotionEvent.ACTION_CANCEL事件如何被触发? 对于这个问题,android文档的说明很简短,想看明白很难.国外一网页说的还比较详细,写在这里分 ...
- android ListView进阶
ListView 1.在android 开发中很多时候都要用到ListView的这个控件的,但用这个控件的时候会遇到一些问题,如在ListView中有Button按钮,就需要将按钮的监听事件给分离出来 ...