1.1字符的Unicode表示法
采用\uxxxx表示一个字符,xxxx表示字符的Unicode码点,这个表示法只限于码点在\u0000~\uFFFF之间的字符,超出范围要用双字节的形式表示
"\u0061"; //a
"\uD842\uDFB7"; // "𠮷"
"\u20BB7"; // " 7",\u20BB是不可打印字符,显示一个空格
// ES6对Unicode表示法的改进
"\u{20BB7}"; // "𠮷"
"\u{41}\u{42}\u{43}"; // "ABC"
1.2字符串的遍历器接口
ES6为字符串添加了遍历器接口
for (let item of 'foo') {
console.log(item)
}
// "f"
// "o"
// "o"
1.3特殊字符
JavaScript 规定有5个字符,不能在字符串里面直接使用,只能使用转义形式。
- U+005C:反斜杠(reverse solidus)
- U+000D:回车(carriage return)
- U+2028:行分隔符(line separator)
- U+2029:段分隔符(paragraph separator)
- U+000A:换行符(line feed)
1.4模版字符串
模版字符串是增强版的字符串,用反引号(`)标识。可以当作普通字符串使用,也可以定义多行字符串,也可以在字符串中嵌入变量。
1.3.1基本用法
let message = `Hello World`;
要在模版字符串中使用反引号,可以使用反斜杠转义
let message = `Hello \` World`;
空格、缩紧、换行都被保留
let message = `
<ul>
<li>1</li>
<li>2</li>
</ul>
`;
如果你不想要这个换行,可以使用trim方法消除它。
let message = `
<ul>
<li>1</li>
<li>2</li>
</ul>
`.trim();
1.3.2嵌入变量
模板字符串中嵌入变量,需要将变量名写在${}之中。其实不止变量,任意的 JavaScript 表达式都是可以的
let x = 1, y = 2;
let message = `<ul><li>${x}</li><li>${x + y}</li></ul>`;
console.log(message); // <ul><li>1</li><li>3</li></ul>
支持嵌套
let arr = [{value: 1}, {value: 2}];
let message = `
<ul>
${arr.map((item) => {
return `
<li>${item.value}</li>
`
})}
</ul>
`;
console.log(message);
/*
<ul>
<li>1</li>
,
<li>2</li>
</ul>
*/
在 li 标签中间多了一个逗号,这是因为当大括号中的值不是字符串时,会将其转为字符串,比如一个数组 [1, 2, 3] 就会被转为 1,2,3,逗号就是这样产生的。可以用join消除。
模板字符串之中还能调用函数
function fn() {
return "Hello World";
}
console.log(`foo ${fn()} bar`); // foo Hello World bar
1.4标签模板
模板字符串可以紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串。称为标签模板。
标签模板其实不是模板,而是函数调用的一种特殊形式。“标签”指的就是函数,紧跟在后面的模板字符串就是它的参数。
let x = 'Hi', y = 'Kevin';
var res = message`${x}, I am ${y}`;
console.log(res);
// 等同于
message(["",", I am ", ""],"Hi","Kevin");
message函数用来处理返回的字符串。
function message(literals, value1, value2) {
// ...
}
// 等同于
function message(literals, ...values){
//...
}
函数第一个参数为数组,数组成员是模版字符串中没有变量替换的部分。变量替换只发生在数组的第一个成员之后。
1.5字符串新增方法
1.5.1 String.fromCodePoint()
静态方法返回使用指定的代码点序列创建的字符串。
参数: num1, ..., numN: 一串 Unicode 编码位置,即“代码点”。
返回值:使用指定的 Unicode 编码位置创建的字符串。
console.log(String.fromCodePoint(9731, 9733, 9842, 0x2F804));
// expected output: "☃★♲你"
1.5.2实例方法includes(), startsWith(), endsWith()
用来确定一个字符串是否包含在另一个字符串中
s.startsWith('Hello') // true
s.endsWith('!') // true
s.includes('o') // true
1.includes()
判断一个字符串中是否包含在另一个字符串,根据情况返回true或false。
参数:
- searchString要在此字符串中搜索的字符串。
- position,可选。从当前字符串的哪个索引位置开始搜寻子字符串,默认值为0。
区分大小写
2.startsWith
判断当前字符串是否以另外一个给定的子字符串开头,根据结果返回true或false。
参数:
- searchString要搜索的子字符串。
- position 可选。在 str 中搜索 searchString 的开始位置,默认值为 0,也就是真正的字符串开头处。
3.endsWith()
判断当前字符串是否是以另外一个给定的子字符串“结尾”的,根据判断结果返回 true 或 false。
参数:
- searchString要搜索的子字符串。
- length,可选。作为 str 的长度。默认值为 str.length。
1.5.3实例方法:repeat()
构造并返回一个新字符串,该字符串包含被连接在一起的指定数量的字符串的副本。
参数:count--介于0和正无穷大之间的整数 : [0, +∞) 。表示在新构造的字符串中重复了多少遍原字符串。参数如果是小数,会取整。
x'.repeat(3) // "xxx"
'hello'.repeat(2) // "hellohello"
'na'.repeat(0) // ""
'na'.repeat(2.9) // "nana"
1.5.4实例方法:padStart(), padEnd()
用于字符串补全长度
1.padStart()
用另一个字符串填充当前字符串(重复,如果需要的话),以便产生的字符串达到给定的长度。填充从当前字符串的开始(左侧)应用。
参数:
- targetLength当前字符串需要填充到的目标长度。如果这个数值小于当前字符串的长度,则返回当前字符串本身。
- padString 可选 填充字符串。如果字符串太长,使填充后的字符串长度超过了目标长度,则只保留最左侧的部分,其他部分会被截断。
'x'.padStart(5, 'ab') // 'ababx'
'x'.padStart(4, 'ab') // 'abax'
2.padEnd()
同上,填充从当前字符串末尾(右侧)开始填充
'x'.padEnd(5, 'ab') // 'xabab'
'x'.padEnd(4, 'ab') // 'xaba'
1.5.5实例方法:trimStart()/trimLeft, trimEnd()/trimRight()
trimStart() / trimLeft()方法移除原字符串左端的连续空白符并返回,方法并不会直接修改原字符串本身。
trimStart() / trimLeft()方法移除原字符串左端的连续空白符并返回,方法并不会直接修改原字符串本身。
const s = ' abc ';
s.trim() // "abc"
s.trimStart() // "abc "
s.trimEnd() // " abc"
摘自阮一峰