注册 登录

清河洛

javascript中的字符串String

qingheluo2016-12-16清河洛478
一、创建String1.字面量写法:可以由双引号(")、单引号(')或反引号(`)表示反引号可以用来定义多行字符串 反引号中可以直接在字符串中间引用变量,使用${}包含变量,如`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');...

一、创建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的数字

码元和码点.png

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)  // ['北京', '福建', '广东', '杭州', '南京', '上海']


网址导航