2-JavaScript中字符串的概念及其常用方法

字符串概念

所有用单引号,双引号,反引号包起来的都是字符串

let str = 'helloWorld';
//每一个字符串都是由零到多个字符组成的
str.length;//=>字符串长度
str[0];//=>获取索引为0(第一个)字符
str[str.length-1];//=>获取最后一个字符str.length-1最后一项索引

str[1000];//=>undefined 不存在这个索引
//数组通过索引和对象通过属性名来获取值不存在时都返回undefined

//循环遍历字符串中的每一个字符
for(let i=0;i<str.length;i++){
    let char = str[i];
    console.log(char);
}
字符串中常用的方法
  • 三个维度记忆字符串的方法
    • 方法的作用和含义
    • 方法的实参(类型和含义)
    • 方法的返回值
  1. charAt/charCodeAt:通过索引获取某一项的值
    charAt:根据索引获取指定位置的字符
    charCodeAt:获取指定字符的ASII码值(Unicode编码值)

str.charAt(n):
@params:参数 – n [number]获取字符指定的索引
@return:返回值 – 返回查找到的字符
找不到返回的是空字符串不是undefined,或者对应的编码值

string.charCodeAt(n)
@params:参数 – n [number]获取字符指定的索引
@return:返回值 – 返回查找到的字符对应的ASII码值(Unicode编码值)
找不到返回的是NaN

let str = 'helloworld';

str[0];//=>"h"
str.charAt(0);//=>"h"

str[100];//=>undefined
str.charAt(100);//=>"" 找不到返回的是空字符串

//通过字符找到编码值
str.charCodeAt(0);//=>104
str.charCodeAt(100);//NaN 找不到对应的字符返回的是NaN

//String有个方法通过编码值找到字符
String.fromCharCode(104);//=>"h"

console.dir(String)
/*
ƒ String()
arguments: (...)
caller: (...)
length: 1
name: "String"
prototype: String {"", constructor: ƒ, anchor: ƒ, big: ƒ, blink: ƒ, …}
fromCharCode: ƒ fromCharCode()//通过编码值找到字符
fromCodePoint: ƒ fromCodePoint()
__proto__: ƒ ()
*/

  1. substr/substring/slice: 字符串的截取(原字符串不改变)
    都是为了实现字符串的截取(在原来字符串中查找到自己想要的)
    2.1 substr(n,m):从索引n开始截取m个字符,m不写截取到末尾(后面方法也是)
    2.2 substring(n,m):从索引n开始找到索引为m处(不含m)
    2.3 slice(n,m):和substring一样,都是找到索引为m处,但是slice可以支持负数作为索引,其余两个方法是不可以的。
let str = 'helloworld';
console.log(str.substr(1,3));//=>ell
console.log(str.substring(1,3));//=>el
console.log(str.substr(2));//=>lloworld
console.log(str.substring(2,100));//=>lloworld

console.log(str.substring(1,3));//=>el
console.log(str.slice(1,3));//=>el
console.log(str.substring(-3,-1));//=>''空字符串
//负数索引相当于与str.length相加后的索引
console.log(str.slice(-3,-1));//=>rl
  1. indexOf/lastIndexOf/includes:验证字符是否存在
    (字符串中的indexOf/lastIndexOf兼容所有的浏览器,数组中的这2个方法仅支持IE8以上)
    3.1 indexOf(x,y):获取x第一次出现位置的索引,y是控制查找的起始位置索引(从前向后找)
    string.lastIndexOf(searchvalue,start);从后开始数star
    3.2 lastIndexOf(x,y):最后一次出现位置的索引(从后向前找)
    string.indexOf(searchvalue,start);从前开始数star
    indexOf/lastIndexOf – @return:没有这个字符返回-1,有就返回第一次/最后一次出现的位置索引
    3.3 includes():是否包含,返回布尔值(ES6)
let str = 'helloaworld';
console.log(str.indexOf('ll'));//=>2
console.log(str.lastIndexOf('l'));//=>9
console.log('a',3);

console.log(str.indexOf('k'));//=>-1
console.log(str.lastIndexOf('k'));//=>-1
console.log(str.indexOf('oa'));//=>4
console.log(str.lastIndexOf('oa'));//=>4

if(str.includes('k')){
    console.log('yes');
}else{
    console.log('no');
}
  1. toUpperCase/toLowerCase:字符串中字母的大小写转换(原字符串不改变)
    toUpperCase():转大写
    toLowerCase():转小写
let str = 'helloaworld';
str = str.toUpperCase();
console.log(str);//=>HELLOAWORLD
str = str.toLowerCase();
console.log(str);//=>helloaworld

str = str.substr(0, 1).toUpperCase() + str.substr(1);
console.log(str);//Helloworld
  1. split():把字符串按照指定的分隔符拆分成数组(和数组中的join相对应)
    split([分隔符]):支持传递正则表达式
//需求:把|分隔符变为逗号分隔符
let str = 'music|movie|food|sport';

//实现以上需求:
let ary=str.split('|');
console.log(ary);//=>[ 'music', 'movie', 'food', 'sport' ];

将数组转换为逗号拼接的字符串的三种方法:

  • ary.toString()
  • ary.join() – 参数为空时默认是逗号拼接
  • ary.join(’,’)
//1. str=ary.toString();
//2. str=ary.join();
str=ary.join(',');//3.
console.log(str);//=>'music,movie,food,sport'
  1. replace(searchvalue,newvalue):将字符串中的searchvalue替换为newvalue(返回替换后的字符串,原来的字符串不变)
    string.replace(searchvalue,newvalue)
    searchvalue:必须。规定子字符串或要替换的模式的 RegExp 对象。
    请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象。
    newvalue:必需。一个字符串值。规定了替换文本或生成替换文本的函数。
    replace(老字符,新字符):实现字符串的替换
let a = 'aaabc';
let b = a.replace('a','k');
console.log(a);//'aaabc'
console.log(b);//'kaabc'  replace()调用一次只替换一个

//需求:把@分隔符变为+分隔符
let str = 'music@movie@food@sport';
str = str.replace('@', '+');
//在不使用正则表达式的情况下,调用一次replace只能替换一次
console.log(str);//=>music+movie@food@sport

str=str.replace(/@/g,'+')
console.log(str);//=>music+movie+food+sport
字符串中的其它常用方法

控制台输出String.prototype查看字符串的所有方法,在MDN网站中可以查看各个方法如何使用。

String.prototype
/*
constructor: ƒ String()
anchor: ƒ anchor()
big: ƒ big()
blink: ƒ blink()
bold: ƒ bold()
charAt: ƒ charAt()
charCodeAt: ƒ charCodeAt()
codePointAt: ƒ codePointAt()
concat: ƒ concat()
endsWith: ƒ endsWith()
fontcolor: ƒ fontcolor()
fontsize: ƒ fontsize()
fixed: ƒ fixed()
includes: ƒ includes()
indexOf: ƒ indexOf()
italics: ƒ italics()
lastIndexOf: ƒ lastIndexOf()
link: ƒ link()
localeCompare: ƒ localeCompare()
match: ƒ match()
matchAll: ƒ matchAll()
normalize: ƒ normalize()
padEnd: ƒ padEnd()
padStart: ƒ padStart()
repeat: ƒ repeat()
replace: ƒ replace()
search: ƒ search()
slice: ƒ slice()
small: ƒ small()
split: ƒ split()
strike: ƒ strike()
sub: ƒ sub()
substr: ƒ substr()
substring: ƒ substring()
sup: ƒ sup()
startsWith: ƒ startsWith()
toString: ƒ toString()
trim: ƒ trim()
trimStart: ƒ trimStart()
trimLeft: ƒ trimStart()
trimEnd: ƒ trimEnd()
trimRight: ƒ trimEnd()
toLocaleLowerCase: ƒ toLocaleLowerCase()
toLocaleUpperCase: ƒ toLocaleUpperCase()
toLowerCase: ƒ toLowerCase()
toUpperCase: ƒ toUpperCase()
valueOf: ƒ valueOf()
Symbol(Symbol.iterator): ƒ [Symbol.iterator]()
*/
  1. 练习题:实现一些常用的需求–将时间字符串变为自己需要的格式呈现出来
let time = '2020-4-18 12:6:20';
//=>变为自己需要呈现的格式,例如:
//"2020年4月18日 12时6分20秒"
//"2020年4月18日"
//"04/18 12:06"

方案一:一路replace

let time = '2020-4-18 12:6:20';
time = time.replace('-', '年').replace('-', '月').replace(' ', '日 ').replace(':', '时').replace(':', '分') + '秒';
console.log(time);//2020年4月18日 12时6分20秒

方案二:获取到年月日小时分钟秒这几个值后,最后想拼成什么效果就拼成什么

let time = '2020-5-18 12:6:20';
//获取值的方法一:基于indexOf获取制定字符索引,基于substring一点点截取
let n = time.indexOf('-');
let m = time.lastIndexOf('-');
let x = time.indexOf(' ');
let y = time.indexOf(':');
let z = time.lastIndexOf(':');

let year = time.substring(0, n);
let month = time.substring(n + 1, m);
let day = time.substring(m + 1, x);
let hour = time.substring(x + 1, y);
let minute = time.substring(y + 1, z);
let second = time.substring(z + 1);
console.log(year, month, day, hour, minute, second);

//获取值的方法二:利用split()一项项拆分
let n = time.split(' ');//[ '2020-5-18', '12:6:20' ] 
let m = n[0].split('-');//[ '2020', '5', '18' ]
let x = n[1].split(':');// [ '12', '6', '20' ]
console.log(n, m, x);

//获取值的方法三:利用正则 ?: 问号+冒号:代表只匹配不捕获   |竖线:代表或者  g表示全局
let ary = time.split(/(?: |-|:)/g)
console.log(ary);//[ '2020', '5', '18', '12', '6', '20' ]

time = ary[0] + '年' + ary[1] + '月' + ary[2] + '日';
console.log(time);//2020年4月18日

不足十位补零

//第一种实现方法:
let addZero=val=>{
    /*
     if(val.length<2){
         val='0'+val;
     }*/
     //简写为一行代码
    val.length<2?val='0'+val:val;
    return val;
}

//第一种的优化方法:
function addZero(val){
    return val.length < 2 ? val = '0' + val : val;
}

//优化方法简写:
let addZero = val => val.length < 2 ? val = '0' + val : val;

//最终结果拼接:
time = ary[0] + '年' + addZero(ary[1]) + '月' + addZero(ary[2]) + '日';
console.log(time);//2020年04月18日

  1. 练习题:实现一个方法 queryUPLParameter获取一个URL地址问号后面传递的参数信息
'http://wwww.baidu.com/index.html?lx=1&name=study&teacher=best#box'

1.一开始的做法

let url = 'http://wwww.baidu.com/index.html?lx=1&name=study&teacher=best#box';

//1.获取问号或者井号后面的值
let askIndex = url.indexOf('?');
let wellIndex = url.indexOf("#");
let askTxt = url.substring(askIndex + 1, wellIndex);
let wellTxt = url.substring(wellIndex + 1);

//2.问号后面值的详细处理
let result = {};
let askAry = askTxt.split('&');
console.log(askAry);//[ 'lx=1', 'name=study', 'teacher=best' ]
askAry.forEach(item => {
    let n = item.split("=");
    let key = n[0];
    let value = n[1];
    result[key] = value;
});
console.log(result);//{ lx: '1', name: 'study', teacher: 'best' }
result['HASH'] = wellTxt;
console.log(result);//{ lx: '1', name: 'study', teacher: 'best', HASH: 'box' }

2.优化封装函数:这个方法在实际的项目中可以直接用的

封装函数时要考虑几种情况:
1.没有#的:http://wwww.baidu.com/index.html?lx=1&name=study&teacher=best
2.没有?的:http://wwww.baidu.com/index.html#box
这些情况在封装函数时都要考虑到

/*
queryURLParams:获取URL地址中问号传参的信息和哈希值
@params
    url[string] 要解析的URL字符串
@return
    [object] 包含参数和哈希值信息的对象
by xxx on 2020/05/18 12:00
*/

function queryURLParams(url) {

    //1.获取?和#后面的信息
    let askIn = url.indexOf("?"),
        wellIn = url.indexOf('#'),
        askTxt = '',
        wellTxt = '';

    //#不存在或者存在都可以
    wellIn === -1 ? wellIn = url.length : null;
    //?存在
    askIn >= 0 ? askTxt = url.substring(askIn + 1, wellIn) : null;
    wellTxt = url.substring(wellIn + 1);
    /*
    if (askIn >= 0) {
        //?存在
        askTxt = url.substring(askIn + 1, wellIn);
    }
    */
    
    //2.获取每一部分信息
    let result = {};
    wellTxt !== '' ? result['HASH'] = wellTxt : null;
    if (askTxt !== '') {
        let ary = askTxt.split('&');
        ary.forEach(item => {
            let itemAry = item.split('=');
            result[itemAry[0]] = itemAry[1];
        })
    }
    return result;
}
let url = 'http://wwww.baidu.com/index.html?lx=1&name=study&teacher=best#box';
let url1 = 'http://wwww.baidu.com/index.html#box';
let url2 = 'http://wwww.baidu.com/index.html?lx=1&name=study&teacher=best';

console.log(queryURLParams(url));//{ HASH: 'box', lx: '1', name: 'study', teacher: 'best' }
console.log(queryURLParams(url1));//{ HASH: 'box' }
console.log(queryURLParams(url2));//{ lx: '1', name: 'study', teacher: 'best' }

3.二次封装的方法:基于正则封装的才是最好的

function queryURLParams(url){
    let result ={},
        reg1=/([^?=&#]+)=([^?=&#]+)/g,
        reg2=/#([^?=&#]+)/g;
    url.replace(reg1,(n,x,y)=>result[x]=y);
    url.replace(reg2,(n,x)=>result['HASH']=x);
    return result;
}
let url = 'http://wwww.baidu.com/index.html?lx=1&name=study&teacher=best#box';
let url1 = 'http://wwww.baidu.com/index.html#box';
let url2 = 'http://wwww.baidu.com/index.html?lx=1&name=study&teacher=best';
let url3 = 'http://wwww.baidu.com/index.html';
console.log(queryURLParams(url));//{ HASH: 'box', lx: '1', name: 'study', teacher: 'best' }
console.log(queryURLParams(url1));//{ HASH: 'box' }
console.log(queryURLParams(url2));//{ lx: '1', name: 'study', teacher: 'best' }
console.log(queryURLParams(url3));//{}

其它方法一:利用正则(my)

let url = 'http://wwww.baidu.com/index.html?lx=1&name=study&teacher=best#box';
let n = url.split("?");
let ary = n[1].split(/(?:=|&|#)/g);
let res = {};
let well = ary[ary.length - 1];
//splice原数组会改变,返回截取的片段
ary.splice(ary.length - 1, 1, 'HASH', well);
console.log(ary);//['lx','1','name','study','teacher','best','HASH','box']
/*
for(let i=0;i<ary.length;i++){
    let key=null;
    let value=null;
    if(i%2==0){
     key=ary[i];
     value=ary[i+1];
     res[key]=value;
    }
}
*/
//for循环可以用forEach()来替代
ary.forEach((item, index) => {
    let key=null;
    let value=null;
    if (index % 2 === 0) {
        key = item;
        value = ary[index + 1];
    }else{
        return;//如果没有这个return,最后的结果中第二项就有null: null
    }
    //index%2===0?(key = item,value = ary[index + 1]):null;//{ lx: '1', null: null, name: 'study', teacher: 'best', HASH: 'box' }
    res[key]=value;
});
console.log(res);//{ lx: '1', name: 'study', teacher: 'best', HASH: 'box' }

其它方法二:封装函数(my)

let url = 'http://wwww.baidu.com/index.html?lx=1&name=study&teacher=best#box';
let urlSplice = url => {
    let n = url.split("?");
    let ary = n[1].split(/(?:=|&|#)/g);
    let res = {};
    let well = ary[ary.length - 1];
    ary.splice(ary.length - 1, 1, 'HASH', well);
    ary.forEach((item, index) => {
        let key = null;
        let value = null;
        if (index % 2 === 0) {
            key = item;
            value = ary[index + 1];
        } else {
            return;
        }
        res[key] = value;
    });
    return res;
}
let result = urlSplice(url);
console.log(result);//{ lx: '1', name: 'study', teacher: 'best', HASH: 'box' }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值