- for-of
ES6为字符串添加了遍历器接口,使得字符串可以被for-of循环遍历。
for(let i of 'foo'){
console.log(i)
}
//'f'
//'o'
//'o'
但是其实这种需求用for循环也是可以实现的
var x = 'foo';
for(let i =0;i<x.length;i++){
console.log(x[i]);
}
如果完全一样,那么ES6也不会推出这个接口,那么两者的差别在哪呢?
for-of遍历器的优点在于可以识别大于0xFFFF的码点,而传统的ofr循环时无法识别这样的码点的。
var text = String.fromCodePoint(0x20BB7);
for(let i = 0;i<text.length;i++){
console.log(text[i]);
}
//' '
//' '
for(let i of text){
console.log(i);
}
//"��"
上面代码中,字符串text只有一个字符,但是for循环会认为它包含两个字符(都不可打印),而for-of循环会正确识别出一个字符。
- at()
ES5为字符串对象提供了charAt方法,返回字符串给定位置的字符。
ES6推出了at方法,也是返回字符串给定位置的字符。
两者的区别在于,at方法可以识别大于0xFFFF的字符编码,返回正确的字符。而charAt仅仅是返回字符编码的第一个字节,实际上是无法显示的。
'��'.charAt(0); //'' 这里显示不出来的,是第一个字节编码
'��'.at(0); //'��'
3.includes(),startWith(),endsWith()
传统上,javaScript只有indexOf方法,可以用来确定一个字符串中是否包含在另一个字符串中。
ES6现在又提供了三种新方法。
- includes():返回布尔值,表示是否找到了参数字符串。
- startWith():返回布尔值,表示参数字符串是否在源字符串的头部。
- endsWith() : 返回布尔值,表示参数字符串是否在源字符串的尾部。
var s = 'Hello world!';
s.includes('l');
s.startsWith('H');
s.endsWith('!');
这三个方法还支持第二个参数,表示开始检索的位置。
但是需要注意的是,endsWith()的第二个参数,是表示字符串的前n个字符,而不是其他两个方法所指的从第n个字符开始检索。
var s = 'Hello world!';
s.startsWith('world', 6) // true
s.endsWith('Hello', 5) // true
s.includes('Hello', 6) // false
4.repeat()
repeat()方法返回一个新字符串,表示将原字符串重复n次。
'x'.repeat(3) // "xxx"
'hello'.repeat(2) // "hellohello"
'na'.repeat(0) // ""
参数如果是小数的话,会被向靠近于0的方向取整。也就是说当参数为-1~0的时候,参数取整为0。
'na'.repeat(2.9) // "nana"
如果参数是负数或者Infinity的时候,会报错。
'na'.repeat(Infinity)
// RangeError
'na'.repeat(-1)
// RangeError
如果repeat的参数是字符串,则会先转换成数字。
'na'.repeat('na') // ""
'na'.repeat('3') // "nanana"
5.padStart(),padEnd()
ES7推出了字符串补全长度的功能。如果某个字符串不够指定长度,会在头部或尾部补全。padStart用于头部补全,padEnd用于尾部补全。
'x'.padStart(5, 'ab') // 'ababx'
'x'.padStart(4, 'ab') // 'abax'
'x'.padEnd(5, 'ab') // 'xabab'
'x'.padEnd(4, 'ab') // 'xaba'
如果原字符串的长度,等于或大于指定的最小长度,则返回原字符串。
'xxx'.padStart(2, 'ab') // 'xxx'
'xxx'.padEnd(2, 'ab') // 'xxx'
如果用来补全的字符串与原字符串,两者的长度之和超过了指定的最小长度,则会截去超出位数的补全字符串。
'abc'.padStart(10, '0123456789')
// '0123456abc'
如果省略了第二个参数,那么就会用空格来补全长度。
'x'.padStart(4) // ' x'
'x'.padEnd(4) // 'x '
6.模板字符串
传统的JavaScript语言,输出模板是这样的:
$('#result').append(
'There are <b>' + basket.count + '</b> ' +
'items in your basket, ' +
'<em>' + basket.onSale +
'</em> are on sale!'
);
上面这种写法比较繁琐,所以ES6引入了模板字符串来解决这个问题。
$('#result').append(`
There are <b>${basket.count}</b> items
in your basket, <em>${basket.onSale}</em>
are on sale!
`);
模板字符串是增强版字符串,用反引号(`)来标识。它可以当普通字符串来使用,也可以定义多行字符串,或者在字符串中嵌入变量。
//普通字符串
`In JavaScript '\n' is a line-feed.`
//多行字符串
`In JavaScript this is
not legal.`
console.log(`string text line 1
string text line 2`);
//字符串中嵌入变量
var name = 'Bob', time = 'today';
`Hello ${name},how are you ${time}`
模板字符串中嵌入变量的时候,需要将变量名写在${}之中。