代码片段 - 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 ...
随机推荐
- [WebService]之TCPMon的使用
TCPMon是apache下的一个项目,下载地址:http://ws.apache.org/commons/tcpmon/download.cgi (1)功能: TCPMon可以拦截客户与服务之间的H ...
- 邮件发送服务AWS SES,Mailgun以及SendCloud(转)
原文:http://www.l4zy.com/posts/aws_ses-mailgun-sendcloud.html 电子邮件这一已经诞生很多年的互联网基础服务并没有随着时间的推移而慢慢消亡,实际上 ...
- UNITY3D MAC版本破解
百度网盘下载地址: http://pan.baidu.com/s/1eQmvLqa#path=%252F 包含本体和破解文件 首先说明一下,如果是公司做开发建议去购买正版. 之前网上也有很多人贴出了破 ...
- C#下载http文件
@(编程) using System; using System.IO; using System.Net; namespace Wisdombud.Util { public class HttpH ...
- USB2.0规范
USB是一种支持热插拔的高速串行传输总线,它使用差分信号来传输数据,最高速度可达480Mb/S. USB支持“总线供电”和“自供电”两种供电模式.在总线供电模式下,设备最多可以获得500mA的电流.U ...
- Array types are now written with the brackets around the element type
因为网站翻译的时候应该用的beta/beta2,而再beta4中就会出现问题,解决问题方案: var shopping: String[] = ["Eggs","Milk ...
- datareader几种用法总结
1.本人常用: if (reader["字段名"] != DBNull.Value) { userRegisterInfo.OrgCode = reader["字段名&q ...
- Light oj 1100 - Again Array Queries (鸽巢原理+暴力)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1100 给你n个数,数的范围是1~1000,给你q个询问,每个询问问你l到r之间 ...
- Spring MVC体系结构
[Spring MVC类图]<Spring实战>中:<Spring3.0就这么简单>中:[http://blog.csdn.net/gstormspire/article/de ...
- java正则表达式语法详解及其使用代码实例
原文地址 译者序(下载代码) 正则表达式善于处理文本,对匹配.搜索和替换等操作都有意想不到的作用.正因如此,正则表达式现在是作为程序员七种基本技能之一*,因此学习和使用它在工作中都能达到很高的效率. ...