【JavaScript】JS知识点梳理(三)

十八、字符串

字符串中方法,都不会改变原始字符串,因为是基本数据类型,每一个操作都是直接操作新值。

1、获取字符串指定位置的字符:

  • charAt、charCodeAt、fromCharCode
数组方法作用参数返回值
charAt按索引获取字符
类似str[索引],不同在于后者对于不存在的索引返回undefined
索引:
charAt(str.length)
当前索引位置的字符,索引不存在返回空字符''
charCodeAt按索引获取字符的(十进制)UNICODE编码索引当前索引对应字符的编码,索引不存在返回NaN
String.fromCharCode与上者对应,通过编码获取字符UNICODE编码(十进制的)当前编码对应的字符

2、字符串查找与截取方法:

  • substr、substring、slice
数组方法作用参数返回值
substr截取部分字符串substr(n,m);从索引n开始截取m个,m不写截取到末尾截取的新字符串
substring截取部分字符串substring(n,m),从索引n开始到索引m,不包含m,m不写截取到末尾截取的新字符串
slice(推荐)截取部分字符串slice(n,m),索引n到m,不含m,可以使负值,-1就是(str.length-1)倒数第一个截取的新字符串

3、字符串转换为数组的方法:

  • split
数组方法作用参数返回值
split用于把一个字符串分割成字符串数组字符串或正则表达式
string.split(separator,limit)
返回新数组,不包括 separator 自身

4、字符串查找是否包含某个字符:

  • indexOf、lastIndexOf、includes

5、字符串替换方法:

  • replace
数组方法作用参数返回值
replace用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串(字符串或要替换的模式的 RegExp 对象,替换文本或生成替换文本的函数)
string.replace(searchvalue,newvalue)
新的字符串

6、字符串大小写转换方法:

  • toLowerCase、toUpperCase

7、应用一:时间格式化

  • '2020/3/11 14:10:01'转为'202年03月11日 14时10分01秒'
方案一:split、concat、map 转为数组,用模板字符串拼接
let time = '2020/3/11 14:10:01';
let arr = time.split(' ')
let arrL = arr[0].split('/')
let arrR = arr[1].split(':')
arr = arrL.concat(arrR).map(item=> item.length<2?'0'+item:item)
// console.log(arr);
time = `${arr[0]}${arr[1]}${arr[2]}${arr[3]}${arr[4]}${arr[5]}秒`
console.log(time);
---------------------
改进:
let arr = time.split(/ |\/|:/g); /=[ '2020', '3', '11', '14', '10', '01' ]
let arr = time.match(/\d+/g); /=[ '2020', '3', '11', '14', '10', '01' ]
方案二:正则替换,不用转数组 (没有补0)
time = time.replace('/','年').replace('/','月').replace(' ','日 ').replace(':','时').replace(':','分')+'秒'
console.log(time);
方案三:最终正则
let time = '2020/3/11 14:10:01';
(proto=>{
  function formaTime(template = '{0}年{1}月{2}日 {3}时{4}分{5}秒'){
    let arr = this.match(/\d+/g);
    return template.replace(/\{(\d+)\}/g,(_,n)=>{ //_代表每一个要替换的{0},n是索引,只用到索引
      let time = arr[n]||'0';
      arr[n].length<2?item = '0'+time:null;
      return time
    })
    // return template,字符串的处理是对新值的操作,所以这里return不对
  }
  proto.formaTime = formaTime
})(String.prototype)

time.formaTime()

8、应用二:获取地址栏中问号参数信息queryURLParams

:通过对地址栏参数的获取来请求、展示不同数据

function queryURLParams(url){
  let askIndex = url.indexOf('?'),
      polIndex = url.lastIndexOf('#'),
      askText = '',
      polText = '';
  polIndex>-1?null:polIndex = url.length;
  polText = url.substring(polIndex+1)
  if(askIndex>-1){
    askText = url.substring(askIndex+1,polIndex);
  }
  let obj = {};
  if(polText){obj['HASH'] = polText}
  if(askText){
    askText.split('&').forEach(item=>{
      if(item){
        let arr = item.split('=');
        obj[arr[0]] = arr[1]; /= arr[0]是变量,不能用obj.arr[0]
      }
    })
  }
  return obj
}
let result = 'https://www.bilibili.com/video/BV1Yi4y1t75Y?p=57#video'
console.log(queryURLParams(result))
改进:js中创建一个a标签,将参数url绑定到元素上:
    function queryURLParams(url) {
      let link = document.createElement('a')
      link.href = url;
      let polText = link.hash.substr(1),  /= hash: "#video"
        askText = link.search.substr(1),  /= search: "?p=57"
        obj = {};
      if (polText) {
        obj['HASH'] = polText
      }
      if (askText) {
        askText.split('&').forEach(item => {
          if (item) {
            let arr = item.split('=');
            obj[arr[0]] = arr[1]
          }
        })
      }
      return obj
    }
改进:正则
let result = '4y1t75Y?p=57#video';//这个分号必须加上
(proto=>{
  function queryURLParams(){
    let obj = {};
    this.replace(/([^?=&#]+)=([^?=&#]+)/g,(_,key,value)=>obj[key] = value);
   /= (_,key,vlaue){};其中第一个参数为大正则每次匹配到的整体,
   /=后面参数为大正则匹配内容里面的括号内容,有几个括号可以有几个参数;
    this.replace(/#([^?=&#]+)/g,(_,hash)=>obj['HASH'] = hash);
    /=: _:#video;hash:video;
    return obj;
  }
  proto.queryURLParams = queryURLParams
})(String.prototype)
console.log(result.queryURLParams());

9、应用三:获取四位随机(可能重复)验证码

let str = '0123456789QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm';
function createCode(){
  let newStr = '';
  for(let i=1;i<=4;i++){
    let index = Math.round(Math.random()*(61-0)+0);
    // newStr += str[one]
    let char = str.charAt(index);
    newStr += char;
  }
  return newStr
};
console.log(createCode())
改进:不重复的四位验证码
function createCode(){
  let newStr = '';
  for(let i=1;i<=4;i++){
    let index = Math.round(Math.random()*(61-0)+0);
    let char = str.charAt(index);
    if(newStr.includes('char')){
      i--;
      continue;
    }//判断是否已经包含,不包含正常加,包含重新循环
    newStr += char;
  }
  return newStr
};
---
对于不确定次数,将for循环改为while循环:
while(newStr.length<4){
  let index = Math.round(Math.random()*(61-0)+0);
  let char = str.charAt(index);
  if(!newStr.toUpperCase().includes(char.toUpperCase())){
    newStr += char;
  }

十九、日期对象

1、基本操作

  • new Date():获取当前客户端(本机时间)时间,日期对象的实例,所以是对象数据类型;
    • 日期的实例对象,可以使用原型链上日期方法;
    • get返回数字类型,to返回字符串类型;
    • getTime():获取当前日期距离1970/1/1 00:00:00这个日期之间的毫秒差,常用于比较两个时间;
    • getMonth():获取0-11,代表1~12月;
    • getDay():获取0-6,代表周日-周六;
    • toLocaleDateString():获取当前年月日字符串;
    • toLocaleString():获取当前完整日期字符串;
    • time.toLocaleTimeString():获取当前时间字符串;
    • 其他正常
let time = new Date()
typeof time;//'object'
console.log(time);//Thu Sep 24 2020 12:26:12 GMT+0800 (中国标准时间)
time.toLocaleDateString();//="2020/9/24"
time.toLocaleString();//="2020/9/24 下午12:26:12"
time.toLocaleTimeString();//="下午12:26:12"

2、new Date():也可以时间字符串传参(有规定的格式),来转为日期的实例对象,该几位就几位;

如:new Date('2020/9/07')==>Mon Sep 07 2020 00:00:00 GMT+0800 (中国标准时间)
支持格式:
yyyy/mm/dd
yyyy/mm/dd hh:mm:ss
yyyy-mm-dd :ie下可能不支持,最新应该可以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值