ES6字符串

作者:米书林
参考文章:《菜鸟教程》、《 ECMAScript 6 入门》(阮一峰)

字串的识别

ES6 之前判断字符串是否包含子串,用 indexOf 方法,ES6 新增了子串的识别方法。

1.includes()

includes():返回布尔值,判断是否找到参数字符串。可接收两个参数,第一个是参数字符串(必填),第二个是搜索起始位置索引(可选)

let str = "abc";
str.includes("b");  // true
str.includes("");  // true
str.includes();  // false
str.includes("b",2);  // false
2.startsWith()

startsWith():返回布尔值,判断原字符串是否以参数字符串开头。

let str = "abcde";
str.startsWith("a");  // true
str.startsWith("a",2);   // false
str.startsWith("");  // true
str.startsWith();  // false
2.endsWith()

endsWith():返回布尔值,判断原字符串是否以参数字符串结尾。

let str = "abcde";
str.endsWith("e");  // true
str.endsWith("e",2);   // true
str.endsWith("");  // true
str.endsWith();  // false

注意:
1.这三个方法只返回布尔值,如果需要知道子串的位置,还是得用 indexOf 和 lastIndexOf 。
2.这三个方法如果传入了正则表达式而不是字符串,会抛出错误。而 indexOf 和 lastIndexOf 这两个方法,它们会将正则表达式转换为字符串并搜索它。
3.includes和startsWith的第二个参数表示从第几位开始匹配,endsWith是从字符串指定位置开始,从后往前匹配
4.includes和startsWith若参数字符串位于首位,则第二个参数小于等于0的结果都会返回true,endsWith若参数字符串位于最后一位,则第二个参数大于等于字符串长度-1返回的结果都为true

字符串的重复

1.repeat()

作用:返回新的字符串,表示将字符串重复指定次数返回。
1.基本用法:传递一个参数表示字符串重复的次数

let str = "h";
let new_str = str.repeat(3);
// str = "h" 
// new_str = "hhh"

2.参数为小数:向下取整

let str = "h";
let new_str = str.repeat(4.9);
// str = "h" 
// new_str = ""

3.参数范围为(-1<x<1),重复后为空串

let str = "h";
let new_str = str.repeat(-0.9);
let new_str1 = str.repeat(0.9);
// str = "h" 
// new_str = ""
// new_str1 = ""

4.参数小于等于-1或者 Infinity ,会报错

let str = "h";
let new_str = str.repeat(-2);
let new_str1 = str.repeat(Infinity );
// 报错:Uncaught RangeError: Invalid count value

5.参数为NaN,重复后为空串

let str = "h";
let new_str = str.repeat(NaN);
// new_str = ""

6.参数为其他(undefined,null,[],""," "),则会先用Number()函数处理为number类型,然后再遵从以上规则

let str = "h";
let new_str1 = str.repeat(undefined);  // ""
let new_str2 = str.repeat(null);  // ""
let new_str3 = str.repeat([]);  // ''''
let new_str4 = str.repeat([1]); // "h"
let new_str5 = str.repeat([1,2]); // ""
let new_str6 = str.repeat({});  // ""
let new_str7 = str.repeat("");  // ""
let new_str8 = str.repeat("abs");  // ""
let new_str9 = str.repeat("3");  // "hhh"
let new_str10 = str.repeat(true);  // "h"
let new_str11 = str.repeat(false);  // ""

字符串补全

1.padStart()

作用:返回新的字符串,表示用参数字符串从头部(左侧)补全原字符串

2.padEnd()

作用:返回新的字符串,表示用参数字符串从尾部(右侧)补全原字符串

用法

两个方法都接受两个参数,第一个参数是指定生成的字符串的最大长度,第二个参数是用来补全的字符串。
1.基础用法

let str = "abc"
let str1 = str.padStart(5,"de");
let str2 = str.padEnd(5,"de");
// str1 = "deabc"
// str2 = "abcde"

2.省略第二个参数会用空着填充

let str = "abc"
let str1 = str.padStart(5);
let str2 = str.padEnd(5);
// str1 = "  abc"
// str2 = "abc  "

3.保证原字符串不动的原则下,多余字符串会被省略
a.第一个参数小于等于原字符串长度,返回原字符串

let str = "abc"
let str1 = str.padStart(2,"de");
let str2 = str.padEnd(2,"de");
// str1 = "abc"
// str2 = "abc"

b.第一个参数大于原字符串长度时,缺几位就从第二个参数字符串开头找几位,替补字符串不够则用空格填充

let str = "abc"
let str1 = str.padStart(4,"de");
let str2 = str.padEnd(4,"de");
// str1 = "dabc"
// str2 = "abcd"
用途

1.补全位数
传入一个数字类型数据,返回一个补全位数后的字符串用于显示

function padNum(num){
  let str = num.toString()
  return str = str.padStart(10,"0");
}
let result = padNum(12);
// result = "0000000012"

2.添加文件名后缀
给定一串不带后缀的jpg文件,我们可以用padEnd给气添加上后缀

let old_file_name = "demo"
let new_file_name = old_file_name.padEnd(old_file_name.length+4,".jpg");
console.log(new_file_name);  // demo.jpg

去除字符串首尾空格

1.trimStart()

作用:消除字符串头部的空格,返回新字符串,不会修改原始字符串

2.trimEnd()

作用:消除尾部的空格,返回新字符串,不会修改原始字符串

let str = '  abc  ';
str.trim() // "abc"
str.trimStart() // "abc  "
str.trimEnd() // "  abc"

注意:除了空格键,这两个方法对字符串头部(或尾部)的 tab 键、换行符等不可见的空白符号也有效; 浏览器还部署了额外的两个方法,trimLeft()是trimStart()的别名,trimRight()是trimEnd()的别名。

matchAll()

作用:返回一个正则表达式在当前字符串的所有匹配

模板字符串

传统js如果需要把变量插入到字符串中,只能通过字符串拼接的方式,使用十分别扭,ES6引入了模板字符串,帮我们简化了这些问题。

基本用法

模板字符串相当于加强版的字符串,用反引号 `,除了作为普通字符串,还可以用来定义多行字符串,还可以在字符串中加入变量和表达式。

let str1 = 'come 
on';   // 报错:Uncaught SyntaxError: Invalid or unexpected token
let str2 = `come 
on`; 
// "come
on"

即单引号和双引号定义的普通字符串不能换行,多个空格也会被合并为一个,若需要进行换行只能通过字符串拼接实现;反单引号定义的模板字符串保留空格和换行

模板字符串的特性

1.可以换行
模板字符串定义的字符串空格和换行会被保留,我们定义dom结构的时候不必再用字符串拼接

let innerHtml = `<ul>
  <li>menu</li>
  <li>mine</li>
</ul>
`;
console.log(innerHtml);

// 代码执行的结果如下
<ul>
  <li>menu</li>
  <li>mine</li>
</ul

2.模板字符串可以插入变量
传统js中我们在字符串中插入变量需要进行字符串拼接,例如我们需要定义一个p标签来存放张三的自我介绍信息,代码大概如下:

let name = "张三",
    age = 23,
    addr = "广东";
let person_info = '<p>大家好,我的名字叫'+ 
name + '今年' + age + '岁,来自' +
addr + '省</p>'
document.write(person_info);

// 代码执行后会在页面写入下面的语句
// 大家好,我的名字叫张三今年23岁,来自广东省

从上面代码可以看出,我们使用了很多字符串拼接符号“+”,而且拼接后DOM结构也不便于阅读,我们应用ES6可以在不改变DOM结构的情况下插入变量,ES6中上述代码大概如下:

let name = "张三",
    age = 23,
    addr = "广东";
let person_info = `<p>大家好,我的名字叫${name}今年${age}岁,来自${addr}省</p>`
document.write(person_info);

// 代码执行后会在页面写入下面的语句
// 大家好,我的名字叫张三今年23岁,来自广东省

它们执行的结果都是一样的,但是用字符串拼接就像说话总是被打断一样,而使用模板字符串我们就能将一句话很连贯的说出来了。

2.模板字符串可以嵌入表达式
使用字符串拼接的时候,如果需要引入表达式我们需要考虑计算的优先级,不然得不到我们计算的结果,例如

let a = 12,
    b = 20,
let str = a + '年前我' + a + '岁,那' + b + '年后我应该是' + a + a + b + '岁';
console.log(str);
// "12年前我12岁,那20年后我应该是121220岁"

上述代码执行的结果显然不是我们想要的,因为我们没有考虑优先级,实际上我们没有特殊处理的情况下,这段代码“=”右边的代码是从左往右的顺序执行的,执行到a+a+b的时候他们受前面执行结果的影响,因前面执行结果是字符串,所以这个运算被当成了字符串拼接,而不是数学运行,要实现我们的效果我们需要提升他们的优先级,代码如下:

let a = 12,
    b = 20,
let str = a + '年前我' + a + '岁,那' + b + '年后我应该是' + (a + a + b) + '岁';
console.log(str);
// "12年前我12岁,那20年后我应该是44岁"

使用模板字符串可以很方便的解决这个问题,代码大概如下

let a = 12,
    b = 20,
let str = `${a}年前我${a}岁,那${b}年后我应该是${a + a + b}岁`;
console.log(str);
// "12年前我12岁,那20年后我应该是44岁"

使用模板变量我们就不用在一些简单的计算上面花时间处理优先级问题,因为变量都被放在了${}中。

3.模板字符串中可以调用函数

function getNowDate(){
  let nowDate = new Date();
  return nowDate = `${nowDate.getFullYear()}年${nowDate.getMonth()}月${nowDate.getDate()}日`
}
let text = `当前日期是:${getNowDate()}`
console.log(text);
// 当前日期是:2019年9月22日

4.模板字符串可以嵌套
模板字符串还可以嵌套使用,例如

let str = `你好,`我是嵌套使用的模板字符串`1`
console.log(str);
// 浏览器报错

为什么呢?这是因为浏览器解析的时候把前面两个解析成一对,后面两个解析成了一对,所以中间部分不再是字符串了。嵌套使用需要引入一个{},即一般为变量中使用,下面的代码是可行的

const tmpl = addrs => `
  <table>
  ${addrs.map(addr => `
    <tr><td>${addr.first}</td></tr>
    <tr><td>${addr.last}</td></tr>
  `).join('')}
  </table>
`;

标签模板

模板字符串紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串。这被称为“标签模板”功能(tagged template)。
标签模板其实不是模板,而是函数调用的一种特殊形式。“标签”指的就是函数,紧跟在后面的模板字符串就是它的参数。

alert`你好!`;
// 等价于
alert('你好!');

但是使用console.log打印的结果却不是一样的

console.log`你好`;
// ["你好", raw: Array(1)]
console.log('你好')
// 你好

但是,如果模板字符里面有变量,就不是简单的调用了,而是会将模板字符串先处理成多个参数,再调用函数。

let a = 5;
let b = 10;

tag`Hello ${ a + b } world ${ a * b }`;
// 等同于
tag(['Hello ', ' world ', ''], 15, 50);
还原参数字符串
function f(stringArr,...values){
 let result = "";
 for(let i=0;i<stringArr.length;i++){
  result += stringArr[i];
  if(values[i]){
   result += values[i];
        }
    }
 return result;
}
let name = 'Mike';
let age = 27;
f`My Name is ${name},I am ${age+1} years old next year.`;
// "My Name is Mike,I am 28 years old next year."
 
f`My Name is ${name},I am ${age+1} years old next year.`;
// 等价于
f(['My Name is',',I am ',' years old next year.'],'Mike',28);
过滤HTML字符串
function f(stringArr,...values){
 let result = "";
 for(let i=0;i<stringArr.length;i++){
  result += stringArr[i];
   if(values[i]){
     result += String(values[i]).replace(/&/g, "&amp;")
               .replace(/</g, "&lt;")
               .replace(/>/g, "&gt;");
    }
 }
 return result;
}
name = '<Amy&MIke>';
f`<p>Hi, ${name}.I would like send you some message.</p>`;
// <p>Hi, &lt;Amy&amp;MIke&gt;.I would like send you some message.</p>
国际化处理(转化多国语言)
i18n`Hello ${name}, you are visitor number ${visitorNumber}.`;  
// 你好**,你是第**位访问者
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容