16、JS切换字母大小写

JS切换字母大小写

  • 输入一个字符串,切换其中字母的大小写
  • 如:12aBc34, 输出:12AbC34

常见思路

  • 正则表达式匹配
  • ASCII编码匹配

代码实现

  • 正则表达式
export function switchLetterCase1 (str:string):string {
  let res = ''
  const len = str.length
  if(len === 0) return res

  const reg1 = /[a-z]/
  const reg2 = /[A-Z]/

  for (let i = 0; i < len; i++) {

    const c = str[i]
    if (reg1.test(c)) {
      res += c.toUpperCase()
    } else if (reg2.test(c)){
      res += c.toLowerCase()
    } else {
      res += c
    }
  }

  return res
}
  • ASCII 码方式
export function switchLetterCase2 (str:string):string {
  let res = ''
  const len = str.length
  if(len === 0) return res

  for (let i = 0; i < len; i++) {
    
    const c = str[i]
    const code = c.charCodeAt(0)

    if (code >= 97 && code <= 122) {
      res += c.toUpperCase()
    } else if (code >= 65 && code <= 90){
      res += c.toLowerCase()
    } else {
      res += c
    }
  }

  return res
}

功能测试

const s = '12aBc34'
switchLetterCase1(s)
switchLetterCase2(s)

打印结果

12AbC34
12AbC34

单元测试

describe('字母大小写切换',() => {
  it('正常情况', () => {
    const s = '12aBc34'
    expect(switchLetterCase1(s)).toBe('12AbC34')
    expect(switchLetterCase2(s)).toBe('12AbC34')
  })

  it('空字符串', () => {
    expect(switchLetterCase1('')).toBe('')
    expect(switchLetterCase2('')).toBe('')
  })

  it('非字母', () => {
    expect(switchLetterCase1('121215你好')).toBe('121215你好')
    expect(switchLetterCase2('121215你好')).toBe('121215你好')
  })
})

性能测试

console.time('switchLetterCase1')
for (let i = 0; i < 100 * 10000; i++) {
 switchLetterCase1(s)
}
console.timeEnd('switchLetterCase1')

console.time('switchLetterCase2')
for (let i = 0; i < 100 * 10000; i++) {
 switchLetterCase2(s)
}
console.timeEnd('switchLetterCase2')

打印结果

switchLetterCase1: 3.007s
switchLetterCase2: 1.356s

ASCII 码优于 正则表达式

性能分析

  • 使用正则表达式,性能较差
  • 使用ASCII码判断,性能较好——推荐答案

总结

  • 慎用正则表达式
  • 常见字符的ASCII码
  • 增加知识广度,可以更快的思考解决问题的方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天界程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值