javascript中的字符串String
一、创建String
1.字面量写法:可以由双引号(")、单引号(')或反引号(`)表示
反引号可以用来定义多行字符串
反引号中可以直接在字符串中间引用变量,使用${}包含变量,如`this is ${name}’s blog`
var str = 'sanqian';
str.name = 'xia';
console.log(str.name) //undefined
console.log(typeof str); //string
2.new运算符写法:
var str = new String('sanqian');
str.name = 'xia';
console.log(str.name); //xia
console.log(typeof str); //object
使用new关键字创建的类型是Object类型,可以添加属性和方法,使用字面量的不能添加属性和方法
有这种特性的还有Boolean和Number,但是在开发过程中不建议这样写,因为这样会导致分不清到底是基本类型值还是引用类型值
码元和码点
码元:Javascript内部操作字符编码的最小单元,2个字节为一个码元,最大Unicode码值0xFFFF(十进制65535)
JavaScript内部字符以UTF-16的格式储存,每个字符存储为2个字节,16进制Unicode码值最大为0xFFFF
但是多种语言字符仅仅使用2个字节不能满足需求,于是UTF-16为这些字符使用了4个字节来存储,导致这些字符的Unicode码值大于0xFFFF
也就是说在UTF-16编码内,有些字符用2个字节存储,有些字节用4个字节存储
码点:根据具体显示字符为操作字符编码的最小节点,可能是2个或4个字节,Unicode码值可以大于0xFFFF
Javascript不能正确识别Unicode码值大于0xFFFF(4字节存储)的字符,会认为它们是两个字符
在Javascript中,只要涉及到字符串索引的操作,都是根据码元来操作的,这就导致会出现字符截断的情况
String.fromCharCode(num1, num2, ..., numN):根据传入的Unicode码值返回字符串
参数值介于0-0xffff之间,大于0xffff的数字将被截断
String.fromCodePoint(num1, num2, ..., numN):根据传入的Unicode码值返回字符串,可以正确解析大于0xffff的数字
let str = '我是𠮷仔😛你好';
console.log(str[2]); // �
console.log(str.at(-2)); // 你
console.log(str.charAt(5)); // �
console.log(str.charCodeAt(2)); // 55362
console.log(str.codePointAt(2)); // 134071
console.log(str.codePointAt(3)); // 57271
String原型对象的方法
length属性:返回字符串的字符长度
字符操作
at(n):按照码元返回指定索引位置的一个字符,可为负数,表示倒数第几位
charAt(n):按照码元返回指定索引位置的一个字符,不能为负数
charCodeAt(n):按照码元返回指定索引位置的一个字符的Unicode编码
codePointAt(n):返回指定索引位置的一个字符的Unicode编码
如果索引在4个字节存储的字符上
如果在这个字符的第一个码元位置,则返回正确的4字节码值
如果在这个字符的第二个码元位置,则返回后2个字节码值
字符串连接
concat(str1...str2):返回字符串和所有参数串联字符串,用于连接多个字符串
字符串截取
slice(n,m):返回字符串n到m之间(含n不含m)的字符串,两个参数都可以是负数,意为倒数第几位
substring(n,m):字符串截取
n和m小于0或为NaN会将该参数设为0
n和m大于字符串长度会将该参数设为字符串长度
当m<n时,会互换他们的位置
str.substring(5,2):由于2<5,转化为str.substring(2,5)
字符串查找
startsWith(search, n=0):是否以字符串s开始,n为开始位置
endsWith(search, n):是否以字符串s结尾,n为结束位置,默认最后一个字符的索引加1,即search.length
includes(s,n=0):从偏移量n开始是否包含字符串s
indexOf(s,n=0):返回从偏移量n开始搜索的第一个字符串s的所在索引,未找到返回-1
lastIndexOf(s,n=0):返回从右向左搜索的第一个字符串s的所在索引,未找到返回-1
正则匹配
match(regex):返回正则表达式匹配的所有结果数组,不含捕获组
matchAll(regex):返回正则表达式匹配结果的迭代器,每个结果为一个数组,第一个元素为匹配的子字符串,后面为捕获组结果
search(regexp):返回字符串中搜索到的匹配开始的索引,未找到返回-1
字符串分割
split(pattern):返回字符串按pattern分割的数组
pattern可以为字符串或正则对象
当正则对象中有捕获组时,捕获组的结果被拼接到输出数组中
字符串替换
replace(pattern, replacement):字符串替换,返回替换后的新字符串,原字符串不变
pattern为字符串时,只会替换第一个匹配的字符串
pattern为正则对象时,只有指定g描述符才会进行全部替换,否则仅替换一次
replacement为字符串时,直接替换匹配项
replacement为函数时,替换为将匹配信息作为参数传入函数时的函数返回值
传入的参数match, p1, p2, p3,...,pn, offset, string, groups
match表示匹配的文本
p1-pn:表示捕获到的分组文本
offset:匹配文本在字符串中的开始位置索引
string:正在匹配的整个字符串
groups:一个对象,其键是组名,值是匹配的部分。仅当包含至少一个命名捕获组时才存在该参数
当pattern为正则时、replacement字符串中可以使用特殊标识
$&:匹配的子字符串
$`:匹配结果前面的文本
$':匹配结果后面的文本
$n:匹配成功的第n组内容,n是从1开始的自然数
$$:指代美元符号$
replaceAll(pattern, replacement):字符串替换,返回替换后的新字符串,原字符串不变
用法同replace(),不同的是
该函数会替换全部匹配的字符串
如果pattern为正则必须添加g描述符,否则报错
trim():消除头尾空格、tab、换行等不可见的空白符,返回新字符串,不改变原字符串
trimStart():消除头部空格、tab、换行等不可见的空白符,返回新字符串,不改变原字符串
trimEnd():消除尾部空格、tab、换行等不可见的空白符,返回新字符串,不改变原字符串
大小写转换
toLowerCase():转换为小写
toUpperCase():转换为大写
toLocaleLowerCase(local):根据local区域转换为小写,如'en-US'、'cn-ZH'
toLocaleUpperCase(local):根据local区域转换为大写
字符串填充
padEnd(len, fill=' '):使用fill字符填充字符串右侧直到字符串长度为len
padStart(len, fill=' '):使用fill字符填充字符串左侧直到字符串长度为len
repeat(count):将字符串重复count次
字符串比较
字符串之间比较大小的时候js默认是按照Unicode编码大小来比较的
"上".codePointAt(0) // 19978
"北".codePointAt(0) // 21271
"上" < "北" // true
在实际开发中我们一般不会按照Unicode编码来比较字符的大小,而是以字母拼音来排序
比如对城市"上海"和"北京"排序,我们想要的是"上海的s"和"北京的b"来比较进行排序
这时我们需要使用str1.localeCompare(str2)来进行排序
该函数会根据本地环境中的默认字典(汉语环境下默认根据拼音)来进行比较,如果str1排序大于str2,返回1,否则返回-1
citys = ["杭州","广东","福建","南京","上海","北京"]
citys.sort()
console.log(citys) // ['上海', '北京', '南京', '广东', '杭州', '福建']
citys.sort((str1,str2)=>str1.localeCompare(str2))
console.log(citys) // ['北京', '福建', '广东', '杭州', '南京', '上海']