- string字符串数据类型
- 运算进行字符串拼接
- 字符串中的常用方法
- 【迭代】【解构】字符串的迭代和解构
- 【获取】charAt/charCodeAt【获取指定的索引位置的字符/对应的码值】
- 【检测】indexof/lastIndexOf/includes【检测字符串中某一字符是否存在】返回值与charAt相反
- 【截取】substr/substring/slice【实现字符串查找和截取的方法】都是为了实现字符串的截取
- 【拆分成数组】split【把字符串按照指定的分隔符拆分成数组】【与数组中的join对应】
- 【搜索检索】match/search【在字符串内检索指定的值】【经常伴随着正则使用】
- 【替换】replace【实现字符串的替换】【经常伴随着正则使用】
- 【大小写】toUpperCase/toLowerCase【字符串中字母的大小写转换】
- 【去空格】trim【去除字符串的头尾空格】
- 【去空格】trimLeft【删除字符串左侧的空格】trimRight【删除字符串末尾的空格】
- 【重复生成】repeat
- 【小案例】时间字符串的处理的案例1
- 【小案例】时间字符串的处理的案例2
string字符串数据类型
所有用单引号,双引号,反引号(撇 ES6模板字符串)包起来的都是字符串
把其他类型值转换为字符串
- [val].toString
- String()
隐式转换:
- 字符串拼接:加号运算时,如果一遍出现字符串,则是字符串拼接
- 把对象转换为数字,需要先toString()转换为字符串,再Number()转换为数字
- 基于alert/confirm/prompt/document.write….这些方式输出的内容,都是把内容先转换为字符串,再输出的
运算进行字符串拼接
四则运算法则中,除加法之外,其余都是数学计算,只有加法可能存在字符串拼接(一旦遇到字符串,则不是数学运算,而是字符串拼接
console.log('10'+10);//=>'1010'
console.log('10'+[]);//=>'10'
console.log(10+[]);//=>'10'
//减法则会转换为number然后进行数学运算
console.log('10'-10);//=>0
console.log('10px'-10);//=>NaN
- 关键点:
- 引用类型的数据类型转换为数字,是分为两步的!!!
- 先toString转为字符串
- 再Number转为数字 【所以转换为字符串后会再去+运算一次,若发现是字符串则直接进行拼接,这两步之间是要进行一次运算的】
//面试题
let a = 10+null+true+[]+undefined+'住在山里真不戳'+null+[]+10+false;
console.log(a);//=>'11undefined住在山里真不戳null10false'
/*
分析
//10+null => 10 + 0 => 10
//10+true => 10 + 1 =>11
//11+[] => 11 + '' =>'11'【关键一步:引用类型的数据类型转换为数字,是分为两步的!!!】
//先toString转为字符串,再Number转为数字,所以转换为字符串后会再去+运算一次,发现是字符串所以进行拼接
//因为数组是对象所以会先转化为字符串,则空数组就会变成空字符串
//于是就不会再进一步转换为数字,而是直接进行拼接操作【变成字符串就啥也别想了,直接拼接吧】
//'11'+undefined =>'11undefined'
//'11undefined'+'住在山里真不戳' =>'11undefined住在山里真不戳'
//'11undefined住在山里真不戳'+null =>'11undefined住在山里真不戳null'
//'11undefined住在山里真不戳null'+[] =>'11undefined住在山里真不戳null'【空数组变空字符串拼接就不用写了】
//'11undefined住在山里真不戳null'+10+false =>'11undefined住在山里真不戳null10false'
*/
字符串中的常用方法
【迭代】【解构】字符串的迭代和解构
字符串的原型暴露一个@@iterator方法,可以迭代每个字符:
let str = "abc"
let res = str[Symbol.iterator]();
res.next(); // =>{value:"a",done:false}
res.next(); // =>{value:"b",done:false}
res.next(); // =>{value:"c",done:false}
res.next(); // =>{value:undefined,done:true}
for-of循环也可以迭代
let str = "abc"
for(let res of str){
console.log(res)
}
// a //b//c/
重点:解构赋值
let str = "abcde"
let res = [...str] // =>["a", "b", "c", "d", "e"]
【获取】charAt/charCodeAt【获取指定的索引位置的字符/对应的码值】
- charAt(index):默认值为 0 ; `根据索引获取指定位置的字符
- charCodeAt(index):获取指定字符的ASCII码值(Unicode编码值) (不常用)
@params:都是索引【number】
@return:- charAt:返回查找到的字符(找不到返回空字符串,永远不是undefined)
- charCodeAt:返回查找到的字符(找不到返回空字符串对应的编码值,永远不是undefined)
let str = 'zhuzaishanlizhenbuchuo';
console.log(str.charAt(0));//'z'
console.log(str.[0]);//'z'
console.log(str.charAt(2));//'u'
console.log(str.charAt(100000));//'',找不到也永远不会返回undefined
console.log(str[100000]);//undefined
//----------------------------------------
console.log(str.charCodeAt(0));//122
console.log(String.fromCharCode(122));//'z'//通过码值获得相应字符
【检测】indexof/lastIndexOf/includes【检测字符串中某一字符是否存在】返回值与charAt相反
indexof(x,y):检测当前项在字符串中第一次出现的位置的索引
- @param
- (x,y):x是要查找的内容,y是控制查找的起始位置索引(可选)
lastIndexOf(x):检测当前项在字符串中最后一次出现的位置的索引
includes:检测字符串中是否包含某一项
let str = 'zhuzaishanlizhenbuchuo';
console.log(str.indexOf('n'));//=>9
console.log(str.lastIndexOf('n'));//=>15
console.log(str.indexOf('@'));//=>-1【不存在返回-1】
//若想验证字符串中某一字符是否存在,可以借助这一特点
if(str.indexOf('@')===-1){
//成立则不包含这个字符
}
console.log(str.indexOf('zai'));//=>3
//验证整体第一次出现的位置,返回的索引是第一个字符所在位置的索引值
console.log(str.indexOf('zh',7));//=>12
//从索引7开始向后查找
if(!str.includes('@')){
console.log('当前字符串不包含'@'')
}
【截取】substr/substring/slice【实现字符串查找和截取的方法】都是为了实现字符串的截取
substr(n,m):根据索引获取指定位置的字符
- @params
- (n,m)[number]:截取从
索引
n开始截取m个
字符,【含m】
,m不写则是截取到末尾
- (n,m)[number]:截取从
substring(n,m):根据索引获取指定位置的字符
- @params
- (n,m)[number]:截取从
索引
n开始找到索引为m索引
的地方,【不含m】
,m不写则是找到末尾,【m超过最大索引也是查找到末尾】
- (n,m)[number]:截取从
slice(n,m):根据索引获取指定位置的字符**【支持负数索引】**
- @params
- (n,m)[number]:从索引n开始找到索引为m的地方,
【不含m】
,m不写则是找到末尾 但是slice可以支持负数作为索引,其余两个方法是不可以的
- (n,m)[number]:从索引n开始找到索引为m的地方,
- @return
- 都
包含起始n
都是返回一个新的字符串,不会修改原有字符串
- 都
let str = 'hello world';
console.log(str.substr(3));//'lo world'
console.log(str.substring(3));//'lo world'
console.log(str.slice(3));//'lo world'
console.log(str.substr(3,7));//'lo world'
console.log(str.substring(3,7));//"lo w"
console.log(str.slice(3,7));//'lo w'
console.log(str.substring(3,10000));//'lo world 超出索引最大值或最大数 返回后面全部'
console.log(str.substr(3,-2));//''【substr不支持负数作为索引】
console.log(str.substring(-7,-3));//''【substring不支持负数作为索引】
//----------------------------------
console.log(str.slice(true)); // ello world
console.log(str.slice(false));// hello world
console.log(str.slice(null)); // hello world
console.log(str.slice(undefined)); // hello world
/* true ==>1 false/null/undefined都视为0*/
console.log(str.slice(-7,-3));//'nbuc'【slice可以支持负数作为索引】
/*
快捷查找:负数索引时,我们可以按照【STR.length+负索引】的方式查找
如 slice(-7,-3)=>slice(22-7,22-3)=>slice(15,19)
*/
负数情况
当第一个参数为负数时:
- slice()和substr()方法 =>
参数 = str.length(字符串长度)+ 负索引
- substring()
会把负数转换成0
let str = 'hello world';
console.log(str.slice(-3));//'rld' 和substr 一样
console.log(str.substr(-3));//'rld' => 11+(-3) = 8 相当于=>str.substr(8)
console.log(str.substring(-3)); // hello world
当第二个参数为负数时:
- substr()=>会把第二参数变成0 意思获得零个字符串空字符串
- slice() =>参数 = str.length(字符串长度)+ 负索引
- substring() 会把负数转换成0
而且会把较小都数作为开始位置
let str = 'hello world';
console.log(str.slice(3,-4));//'lo w'
console.log(str.substr(3,-4));//“”空字符串
console.log(str.substring(3,-4)); // hel 先变成substring(3,0)=>最小位置在前substring(0,3)
【拆分成数组】split【把字符串按照指定的分隔符拆分成数组】【与数组中的join对应】
split(‘[分隔符]’):把字符串按照指定的分隔符拆分成数组
//把竖线分隔符变为,分隔符
let str = 'tom is good man!';
let ary = str.split(' ');
console.log(ary);//=>["tom", "is", "good", "man!"]
let ary2 = str.split(' ',3);
console.log(ary2);//=>["tom", "is", "good"]
let ary3 = str.split();
console.log(ary3);//=>["tom is good man!"]
let ary4 = str.split('');
console.log(ary4);//=>["t", "o", "m", " ", "i", "s", " ", "g", "o", "o", "d", " ", "m", "a", "n", "!"]
//------------------------------------
str = ary.join('|');
console.log(str);//=>'tom丨is丨good丨man!'
let ary = str.split('丨');
str = ary.toString();//本来就是按逗号分隔直接转字符串和ary.join(',')效果一样。
console.log(str);//=> tom,is,good,man!
【搜索检索】match/search【在字符串内检索指定的值】【经常伴随着正则使用】
match(正则表达式/字符串/RegExp对象):在字符串内检索指定的值,或找到一个或多个正则表达式的匹配
- @param
- ([正则表达式]):
- 若正则表达式有全局标志g,则 会对字符串进行全部匹配,所有匹配值都将存放到作为返回值的数组中。
- 若正则表达式没有全局标志g,则match() 方法就 只能在指定字符串中执行一次匹配。
- 若参数不是正则表达式(正则对象),则会先传递给RegExp构造函数,将其转换为正则对象,再进行匹配 只能在指定字符串中执行一次匹配。
- ([正则表达式]):
- @return
- 返回一个存放匹配结果的数组。
- 若没有找到任何匹配的值,则会返回null
let str = '住@在@山里@真不戳',
strArr1,
strArr2,
strArr3;
strArr1 = str.match('@');
console.log(strArr1);//=>['@']
strArr2 = str.match(/@/g);
console.log(strArr2);//=> ["@", "@", "@"]
strArr3 = str.match(/-/g);
console.log(strArr3);//=>null
search(正则表达式/字符串/RegExp对象)唯一参数和match一样,返回结果为第一个匹配的位置的索引,如果没有返回 -1
let str = '住@在@山里@真不戳'
strArr1 = str.search('@');
console.log(strArr1);//=> 1
strArr2 = str.search('aaa');
console.log(strArr2);//=> -1
【替换】replace【实现字符串的替换】【经常伴随着正则使用】
replace([老字符],[新字符]):实现字符串的替换
let str = '住@在@山里@真不戳';
str = str.replace('@','-');
console.log(str);//=>'住-在@山里@真不戳'
str = str.replace(/@/g,'-');//使用正则表达式实现一次替换完成
console.log(str);//=>'住-在-山里-真不戳'
【大小写】toUpperCase/toLowerCase【字符串中字母的大小写转换】
- toUpperCase:转大写
- toLowerCase:转小写
- @return
- 返回转换完成后的字符串
let str = 'zhuzaishanlizhenbuchuo';
str = str.toUpperCase();
console.log(str);//=>'ZHUZAISHANLIZHENBUCHUO'
str = str.toLowerCase();
console.log(str);//=>'zhuzaishanlizhenbuchuo'
//
str = 'ZhuZaiShanLiZhenBuChuo';
console.log(str);//=>'ZHUZAISHANLIZHENBUCHUO'
str = 'ZhuZaiShanLiZhenBuChuo';
console.log(str);//=>'zhuzaishanlizhenbuchuo'
//
str = str.substr(0,1).toUpperCase+str.substr(1);
//=>'Zhuzaishanlizhenbuchuo'
- 返回转换完成后的字符串
- @return
【去空格】trim【去除字符串的头尾空格】
- (此效果可通过replace来实现,避免兼容问题)
- trim():去除字符串的头尾空格(不会改变原始的字符串)
- @return
- 返回一个新的字符串
let str = ' 住在山里真不戳 ',
str1;
str1 = str.trim();
console.log(str1);//=>'住在山里真不戳'
- 返回一个新的字符串
- @return
【去空格】trimLeft【删除字符串左侧的空格】trimRight【删除字符串末尾的空格】
trimLeft():删除字符串左侧的空格
- @return
- 返回一个新的字符串(不会改变原始的字符串)
let str = ' 住在山里真不戳 1',
str1;
str1 = str.trimLeft();
console.log(str1);//=>'住在山里真不戳 1'
trimRight():删除字符串末尾的空格
- @return
- 返回一个新的字符串(不会改变原始的字符串)
let str = ' 住在山里真不戳 ',
str1;
str1 = str.trimRight();
console.log(str1);//=>'住在山里真不戳
【重复生成】repeat
- @param
整数参数,设置要复制的次数。下例是根据参数重复生成星号
function star(num = 3) {
return '*'.repeat(num);
}
console.log(star()); //***
【小案例】时间字符串的处理的案例1
- 时间字符串的处理
- 将得到的字符串转化为自己想要的任何格式
let time = '2020-07-31 12:19:23';
//变为自己需要呈现出来的格式
//'2020年07月31日 12时19分23秒'
//'2020年07月31日'
//'07/24 12:06'
//....
//==========方案2:一路replace============
let time1 = '2020-07-31 12:19:23';
time1 = time1.replace('-','年').replace('-','月').replace(' ','日').replace(':','时').replace(':','分')+'秒';
console.log(time1);
//==========方案3:获取年月日时分秒这几个值后,最后想拼成什么就拼成什么
//获取值的方法【1】,基于indexOf获取指定符号索引,基于substring一点点截取数据
let time2 = '2020-07-31 12:19:23';
let n = time2.indexOf('-');
let m = time2.lastIndexOf('-');
let x = time2.indexOf(' ');
let y = time2.indexOf(':');
let z = time2.lastIndexOf(':');
let year = time2.substring(0,n);
let month = time2.substring(n+1,m);
let day = time2.substring(m+1,x);
let hour = time2.substring(x+1,y);
let minute = time2.substring(y+1,z);
let second = time2.substring(z+1);
console.log(year,month,day,hour,minute,second);
//获取值的方法【2】,基于split一项一项拆分
let n1 = time2.split(' ');//['2020-07-31','12:19:23']
let m1 = n1[0].split('-');//['2020','07','31']
let o1 = n1[1].split(':');//['12','19','23']
//获取值的方法【3】,基于split和正则表达式一步拆分
let ary = time2.split(/?: |-|:/g);//['2020','07','31','12','19','23']
time3 = ary[0]+'年'+addZore(ary[1])+'月'+addZore(ary[2])+'日'+addZore(ary[3])+'时'+addZore(ary[4])+'分'+addZore(ary[5])+'秒';
//封装一个不足十位补一个零的方法
/* let addZore = val=>{
if(val.length<2){
val = '0'+val;
}
return val;
} */
let addZore = val => val.length < 2 ? val = '0'+ val : val;
【小案例】时间字符串的处理的案例2
- 基于日期事件对象处理
let time = '2020-08-03 17:35:55';
//变为自己需要呈现出来的格式
//'2020年08月03日 17时35分55秒'
//=================================
function formatTime(time){
/* 先加上不足十位补零的方法 */
function addZore (val){
val = Number(val);
return val<10?'0'+val:val;
}
//1.把时间字符串变为标准日期对象
time = time.replace(/-/g,'/');
time.new Date(time);
//2.基于日期时间对象获取详细信息
let year = time.getFullYear(),
month = addZero(time.getMonth()+1),
day = addZero(time.getDate()),
hours = addZero(time.getHours()),
minutes = addZero(time.getMinutes()),
seconds = addZero(time.getSeconds());
//3.返回想要的结果
return year+'年'+month+'月'+day+'日 '+ hours+':'+minutes+':'+seconds;
}
//------------------使用----------------------
time = formatTime(time);
console.log(time);