跳到主要内容

String

String 为什么是不可变的字符序列?​

  • 编码: 以 16 位 code unit 为基本单元;
  • 不可变: 字符串一旦创建, 内容不能原地修改, 所有"修改"方法都返回新字符串;
  • 长度: length 返回 code unit 数量, 含双字节字符时与肉眼字符数不一致;
"语言".length; // 2; 每个汉字 1 个 code unit
"😀".length; // 2; 代理对占 2 个 code unit

code unit 与 code point 有什么区别?​

  • code unit: 16 位基本单元, 范围 U+0000 到 U+FFFF;
  • code point: 一个字符的码点, 超出基本平面的字符由两个 code unit (代理对) 组成;
  • 处理差异: length、charAt、charCodeAt 按 code unit 处理, codePointAt、String.fromCodePoint 按 code point 合并处理;

字符串字面量如何表达特殊字符?​

转义含义转义含义
\0空字符\'单引号
\b退格\"双引号
\n换行\\反斜杠
\f换页\xnn两位十六进制
\r回车\unnnn四位十六进制
\t水平制表符

模板字面量如何插值与自定义?​

const name = "kxh";
console.log(`My name is ${name}.`);
  • 标签函数: 以模板为参数调用函数, 第一个参数是插值切分出的字符串片段数组 (长度为插值数 + 1), 其余参数依次是各插值;
  • 原始字符串: String.raw 保留反斜杠, 不解释转义;
function tag(strings, a, b, sum) {
return `${strings.length}:${a},${b},${sum}`;
}
tag`${6} + ${9} = ${6 + 9}`; // "4:6,9,15"
String.raw`first line\nsecond line`; // "first line\\nsecond line"

String 有哪些常用方法与静态成员?​

类别方法
构造String(value)、String.fromCharCode(...codes)、String.fromCodePoint(...codePoints)
索引at(i)、charAt(i)、charCodeAt(i)、codePointAt(i)
查找includes、startsWith、endsWith、indexOf、lastIndexOf、search、match、matchAll
切片slice(start, end)、substring(start, end)、split(sep, limit)、concat
变换toLowerCase、toUpperCase、trim、trimStart、trimEnd、repeat、padStart、padEnd、normalize
替换replace、replaceAll
比较校验localeCompare(that)、isWellFormed()
取值toString()、valueOf()
  • 与正则配合: match、matchAll、search、replace 支持正则参数, 详见 RegExp;