已经写到
系列教程
的第三章了,本章节我们一起来探讨字符串
的那些事。在我们的日常工作中,经常会用到模板字符串
,还有一些字符串
的方法
,我们今天就来好好的品一品。谢谢大家的点赞和收藏。
一、字符串的方法
说到
字符串
,我们就会自然而然的想到Unicode
编码。像\u0061
代表的是字母a
,但是Unicode是有一个范围的(\u0000~\uFFFF)
。在JavaScript中1个字符
占用两个字节
。如果在范围内就是一个字符,如果超出
这个范围,JavaScript必须
用2个字符
来进行表示。
1.1 charAt和charCodeAt
1个字符占两个字节
,我们可以使用charCodeAt
打印出字符的Unicode编码,charAt
是打印对应下标字符的值。
js
let str = 'iyongbao';
console.log(str.charCodeAt(0)); // 105
console.log(str.charAt(1)); // y
1.2 includes、startsWith、endsWith
三个方法的返回值均为boolean:
-
试想一下在
ES5
中我们是怎么来判断字符串
是否包含
某一字符
的?jslet str = 'iyongbao'; console.log(str.indexOf('a') !== -1); // true console.log(str.indexOf('z') !== -1); // false
这里我只写了一种,使用
indexOf
方法来判断,通过返回值
来进行判断。如果找到返回对应下标
,如果没找到
则返回-1
。ES6中为我们提供了includes方法来判断是否存在某一字符,返回值为
boolean
。jslet str = 'iyongbao'; console.log(str.includes('a')); // true console.log(str.includes('z')); // false
-
使用
startWith/endsWith
来判断是否以某一字符串开头/结尾
。jslet str = 'Hello World!'; console.log(str.startsWith('Hello')); // true console.log(str.endsWith('!')); // true
-
startWith/endsWith
两个方法有第二个参数
,表示从什么位置开始'截取'
。jslet str = 'Hello World!'; console.log(str.startsWith('World', 6)); // true console.log(str.endsWith('Hello', 5)); // true
startWith
表示从下标6开始为起点一直到最后。endsWith
表示从下标5开始到字符串最开头。
1.3 repeat
-
repeat
方法,顾名思义就是重复
的意思。它可以使我们的字符串重复n
次。jslet str = 'a'.repeat(3); let str1 = 'a'.repeat(0); console.log(str); // aaa console.log(str1); // ''
-
如果参数为
小数
,则会向下取整
。jslet str = 'a'.repeat(6.6); console.log(str); // aaaaaa
-
如果我们传入
小于等于-1
的负数
或者是Infinity
会报错
,传入0
~-1之间
的小数,不报错
。jslet str = 'a'.repeat(-0.8); let str1 = 'a'.repeat(-1.2); let str2 = 'a'.repeat(Infinity); console.log(str); // '' console.log(str1); // RangeError: Invalid count value: -1.2 console.log(str2); // RangeError: Invalid count value: Infinity
1.4 padStart、padEnd
这两个方法的作用是补全
,一般用的最多的就是时间补0
。
js
let str = 'a';
let str1 = 'b';
console.log(str.padStart(5, 0)); // 0000a
console.log(str.padEnd(5, 0)); // a0000
两个方法的参数
:第一个
参数表示字符串
的长度
,第二个
参数表示如果长度不够
来补充
的字符串
。
二、模板字符串
模板字符串
在我们的编码中经常用到,确实很方便相比我们之前ES5
中的字符串拼接
。
2.1 基本用法
-
在之前如果我们想输出一些带变量的字符串可能我们需要像下边这样。
jslet name = 'iyongbao'; let age = 26; let str = '我叫' + name + ', 我今年' + age + '岁啦。' console.log(str); // 我叫iyongbao, 我今年26岁啦。
可以看到这种写法很浪费时间和功夫,如果内容一多了,就会缺这少那的。
-
使用ES6模板字符串会是怎样的呢?
jslet name = 'iyongbao'; let age = 26; let str = `我叫${name}, 我今年${age}岁啦。` console.log(str); // 我叫iyongbao, 我今年26岁啦。
这样看着舒服多啦,我们使用两个反引号'`',变量使用
${变量名}
。值得注意的是,如果在模板字符串中想要表示多行字符串,所有的空格和缩进换行都会被保留在输出中。jslet name = 'iyongbao'; let age = 26; let str = `我叫${name}, 我今年${age}岁啦。` console.log(str);
2.2 ${}
-
如果我们想在模板字符串中输入变量,需要使用
${}
,我们可以在${}
书写任意
的JavaScript表达式
。jslet a = 1; let b = 2; let str = `a + b = ${ a + b}`; console.log(str); // a + b = 3
-
还可以
获取
对象的属性
值jslet obj = { name: 'iyongbao', age: 26 } let str = `${obj.name} -- ${obj.age}`; console.log(str); // iyongbao -- 26
-
我们还可以在模板字符串中
调用函数
jsfunction add (a, b) { return a + b; } let str = `得到的结果为:${add(1, 2)}`; console.log(str); // 得到的结果为:3
注意 :当我们使用
${}
的时候,其实JavaScript底层调用了变量的toString()
方法。
三、标签模板
这个知识点大家可能会陌生,我简单和大家讲一讲,这里的标签说的其实是函数
,模板
说的就是字符串
,给大家演示
一个新颖的函数调用
写法。
js
function foo (array, ...obj) {
console.log(array, obj);
}
let name = 'iyongbao';
let age = 26;
foo`iyongbao ${name} age ${age}`; // ['iyongbao ', ' age ', '', raw: Array(3)] (2) ['iyongbao', 26]
我给大家分析一下结果:我定义了一个函数,这个函数有两个参数
,array
打印的是一个数组
,...obj
接收剩余参数。
第一个参数
里边的值
是模板字符串
中那些没有
被变量替换
的值
;第二个参数
是模板字符串中变量的值
;- 大家发现
array
中有一个raw属性
,这里边存放的是转移后的原字符串。
foo`iyongbao ${name} age ${age}`换成我们常见的写法如下:
foo(['iyongbao ', ' age ', ''], iyongbao, 26);
3.1 raw静态方法
-
这个方法虽然陌生但是很有用,在我们的工作中,经常碰到转义的问题:
jslet path = `C:\work\network`; console.log(path);
我们发现通过
console.log
之后结果换行了。我们只能不让\
转移。jslet path = `C:\\work\\network`; console.log(path);
-
在我们的
String
上有一个静态方法raw
,可以帮助我们完成上边的操作。jslet res = String.raw`C:\work\network`; console.log(res);
-
上边的方式用的还是少,一般都是
后端传给
我们前端
处理后直接进行显示
的,但是这种情况还是会转移。还是用正则处理一下吧,哈哈。jslet path = "C:\work\network"; let res = String.raw`${path}`; console.log(res);
四、总结
今天又和大家探讨了一下ES6中关于
字符串
的一些扩展知识点,有些用的确实少,反正是学海无涯。欢迎各位小伙伴指正批评。