模板字符串
- 传统写法
var str = 'There are <b>' + basket.count + '</b> ' + 'items in your basket, ' + '<em>' + basket.onSale + '</em> are on sale!'
ES6写法
-
let str = ` There are <b>${basket.count}</b> items in your basket, <em>${basket.onSale}</em> are on sale!`
注意:模板字符串中的换行和空格都是会被保留的
变量名写在 ${} 中,${} 中可以放入 JavaScript 表达式。
标签模板
模板字符串的功能,不仅仅是上面这些。它可以紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串。这被称为“标签模板”功能(tagged template)。
- 模板字符串中没有变量
alert`123` // 等同于 alert(123)
标签模板其实不是模板,而是函数调用的一种特殊形式。“标签”指的就是函数,紧跟在后面的模板字符串就是它的参数。
- 模板字符串中含有变量
let a = 5; let b = 10; tag`Hello ${ a + b } world ${ a * b }`; // 等同于 tag(['Hello ', ' world ', ''], 15, 50);
如果模板字符里面有变量,就不是简单的调用了,而是会将模板字符串先处理成多个参数,再调用函数。上面代码中,
模板字符串前面有一个标识名
tag
,它是一个函数。整个表达式的返回值,就是tag
函数处理模板字符串后的返回值。tag
函数的第一个参数是一个数组,该数组的成员是模板字符串中那些没有变量替换的部分,也就是说,变量替换只发生在数组的第一个成员与第二个成员之间、第二个成员与第三个成员之间,以此类推。
tag
函数的其他参数,都是模板字符串各个变量被替换后的值。由于本例中,模板字符串含有两个变量,因此tag
会接受到value1
和value2
两个参数。tag
函数所有参数的实际值如下。- 第一个参数:
['Hello ', ' world ', '']
- 第二个参数: 15
- 第三个参数:50
也就是说,
tag
函数实际上以下面的形式调用。 - 第一个参数:
- demo2
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);
方法
-
子串的识别
ES6 之前判断字符串是否包含子串,用 indexOf 方法,ES6 新增了子串的识别方法。
- includes():返回布尔值,判断是否找到参数字符串。
- startsWith():返回布尔值,判断参数字符串是否在原字符串的头部。
- endsWith():返回布尔值,判断参数字符串是否在原字符串的尾部。
以上三个方法都可以接受两个参数,需要搜索的字符串,和可选的搜索起始位置索引。
let string = "apple,banana,orange"; string.includes("banana"); // true string.startsWith("apple"); // true string.endsWith("apple"); // false string.startsWith("banana",6) // true
注意点:
- 这三个方法只返回布尔值,如果需要知道子串的位置,还是得用 indexOf 和 lastIndexOf 。
- 这三个方法如果传入了正则表达式而不是字符串,会抛出错误。而 indexOf 和 lastIndexOf 这两个方法,它们会将正则表达式转换为字符串并搜索它。
-
字符串重复
repeat():返回新的字符串,表示将字符串重复指定次数返回。- 1.参数如果是小数,会被向下取整。
'na'.repeat(2.9) // "nana"
- 如果参数是 0 到-1 之间的小数,则等同于 0,这是因为会先进行取整运算。0 到-1 之间的小数,取整以后等于
-0
,repeat
视同为 0。'na'.repeat(-0.9) // ""
- 如果参数是 NaN,等同于 repeat 零次
'na'.repeat(NaN) // ""
- 如果参数是负数或者 Infinity ,会报错:
'na'.repeat(Infinity) // RangeError 'na'.repeat(-1) // RangeError
- 如果
repeat
的参数是字符串,则会先转换成数字。'na'.repeat('na') // "" 'na'.repeat('3') // "nanana"
- 1.参数如果是小数,会被向下取整。
-
字符串补全
- padStart:返回新的字符串,表示用参数字符串从头部(左侧)补全原字符串。
- padEnd:返回新的字符串,表示用参数字符串从尾部(右侧)补全原字符串。
以上两个方法接受两个参数,
第一个参数是指定生成的字符串的最小长度,
第二个参数是用来补全的字符串。如果没有指定第二个参数,默认用空格填充。-
- 正常用法
console.log("h".padStart(5,"o")); // "ooooh" console.log("h".padEnd(5,"o")); // "hoooo" console.log("h".padStart(5)); // " h"
- 如果指定的长度小于或者等于原字符串的长度,则返回原字符串:
console.log("hello".padStart(5,"A")); // "hello"
- 如果原字符串加上补全字符串长度大于指定长度,则截去超出位数的补全字符串:
console.log("hello".padEnd(10,",world!")); // "hello,worl"
- 常见用途
- 为数值补全指定位数下面代码生成 10 位的数值字符串。
'1'.padStart(10, '0') // "0000000001" '12'.padStart(10, '0') // "0000000012" '123456'.padStart(10, '0') // "0000123456"
- 提示字符串格式
'12'.padStart(10, 'YYYY-MM-DD') // "YYYY-MM-12" '09-12'.padStart(10, 'YYYY-MM-DD') // "YYYY-09-12"
- 为数值补全指定位数下面代码生成 10 位的数值字符串。
- 正常用法