WebStorage主要提供了一种机制,可以让浏览器提供一种比cookie更加直观的key、value存储方式
localStorage.setItem("key",value)
localStorage.getItem("key")
sessionStorage.setItem("key",value)
sessionStorage.getItem("key")
localStorage.lenth//返回一个整数,表示存储在Storage中的数据项数量
localStorage.setItem("key",value)
localStorage.getItem("key")
localStorage.key(index)//返回存储中的第n个key的名称
localStorage.removeItem("key")//移除某个key
localStorage.clear()//清空所有的key
在实际开发中,通常会将storage的方法包装成一个对象,通过调用对象中的方法,进行使用
class Cache {
//先来判断是采用localStorage还是sessionStorage
constructor(isLocal = true) {
this.storage = isLocal ? localStorage : sessionStorage;
}
setCache(key, value) {
//对value进行字符串的转化处理
if (!value) {
throw new Error("value需要有值!");
}
this.storage.setItem(key, JSON.stringify(value));
}
getCache(key) {
//首先需要判断是否有key对应的存储
const result = this.storage.getItem(key);
if (result) {
return JSON.parse(result);
}
}
}
const myLocalStorage = new Cache();
const mySessionStorage = new Cache(false);
//通过调用实例方法,即可完成相应的本地(会话)存储
在某些特定场景进行会用,前期花费大量时间学习正则表达式,是比较低效的
//在JS中有两种方式可以创建正则表达式
// new RegExp(pattern(规则), flag(标识符))
// /pattern(规则)/flag(标识符)
let res1 = new RegExp("abc", "ig")
let res2 = /abc/ig
//创建一个正则表达式实例对象
//调用实例方法test
//传入要判断的字符串
let rex = /abc/gi;
let message = "wefsdabc";
console.log(rex.test(message)); //true
let rex = /abc/gi;
let message = "wefsdabc";
console.log(rex.exec(message));
/*规则、字符串中第一个个符合规则的位置、字符串本身 */
//[ 'abc', index: 5, input: 'wefsdabc', groups: undefined ]
//match和matchAll
let message = "qwdehabc qwnajfaBc qiwrABC";
let reg = /abc/gi;
console.log(message.match(reg)); //[ 'abc', 'aBc', 'ABC' ]
console.log(message.matchAll(reg)); //返回的是一个迭代器,可以使用for of或者.next()进行遍历
--------------------------
//replace和replaceAll
//将abc(忽略大小写)替换成123
let message = "qwdehabc qwnajfaBc qiwrABC";
let res = message.replace(/abc/ig, 123);
console.log(res);
--------------------------
//split中传入正则表达式
let message = "qwdehabc qwnajfaBc qiwrABC";
let reg = /abc/gi;
console.log(message.split(reg));//[ 'qwdeh', ' qwnajf', ' qiwr', '' ]
--------------------------
//search查找第一个符合规则的位置
let message = "qwdehabc qwnajfaBc qiwrABC";
let reg = /abc/gi;
console.log(message.search(reg));//5
常见的修饰符
g(global)匹配全部的
i(ignore)忽略大小写
m(multiple)多行匹配
let reg = /abc/ig
//匹配全局且忽略大小写的abc
\d(digit)匹配数字0~9
\s(space)匹配空格符号,包含\t \n 等
\w(word)匹配拉丁字母或者数字或者下划线_
. 是一种特殊字符类,除了不能匹配换行符之外的所有字符
let reg = /\d/ig
let reg1 = /\s/ig
let reg2 = /\w/ig
let reg3 = /./ig
\D除了\d以外的任何字符
\S除了\s以外的任何字符
\W除了\w以外的任何字符
^和$分别对应文本的开头和结尾
\b代表词边界,不允许\w的内容出现(即不允许出现字母、数字、下划线_)
//锚点的应用
let message = "my name is zhangcheng";
let regStart = /^my/gi;//以my为开头
let regEnd = /zhangcheng$/gi;//以zhangcheng为结尾
console.log(regStart.test(message));
console.log(regEnd.test(message));
//词边界的应用
//比如现在需要匹配单独的一个单词name
//只有name符合规则,aanamedd这种是不符合规则的
let message = "my name nnamea is zhangcheng";
let reg1 = /name/ig//这种能够匹配包含name的字符串
let reg2 = /\bname\b///这种就能匹配单独一个name单词的了
将特殊的字符,变为正常的字符,前面加一个\反斜杠即可,比如只想匹配一个.的正常字符 .
let message = "a.html"
let reg = /\./ig//即可匹配到点.这个字符
常见需要转义的字符
[ ] / \ ^ $ . | ? * + ( )
//匹配以js或者jsx结尾的字符串
let fileNames = ["a.html", "a.js", "home.jsx", "b.js", "c.js"];
let regStart = /\.jsx?$/;
let newFileNames = fileNames.filter((item) => regStart.test(item));
console.log(newFileNames);
//[ 'a.js', 'home.jsx', 'b.js', 'c.js' ]
需要从多个字符中,匹配其中之一
//匹配手机号
//规则开头以1开头,第二位3-9,后面接9位数字
let reg = /^1[3-9]\d{9}$/;
let phoneArr = ["18039589634", "18039587516", "15421594152338"];
let newPhone = phoneArr.filter((item) => reg.test(item));
console.log(newPhone); //[ '18039589634', '18039587516' ]
let reg = /[^0-9]/
//表示不在0-9范围之内
在匹配字符串的时候,通常是不知道其具体数量的,因此,需要使用量词
//匹配字符串中的所有标签
let htmlElement = "<div>hahah<span>123<p>456</p></span></div>";
let reg = /<\/?[a-z][a-z0-9]*>/gi;
console.log(htmlElement.match(reg));
//需要匹配《》中间的内容
let message = "《活着》、《传说》、《渴望》";
//书名号中的内容,可能出现任意字符,因此使用. 同时会有多个使用+
let reg = /《.+》/gi;
console.log(message.match(reg));//[ '《活着》、《传说》、《渴望》' ]
//需要匹配《》中间的内容
let message = "《活着》、《传说》、《渴望》";
//书名号中的内容,可能出现任意字符,因此使用. 同时会有多个使用+
let reg = /《.+?》/gi;
console.log(message.match(reg)); //[ '《活着》', '《传说》', '《渴望》' ]
//将上面的需求,转变成,只获取书名号中的文字
//需要匹配《》中间的内容
let message = "《活着》、《传说》、《渴望》";
//书名号中的内容,可能出现任意字符,因此使用. 同时会有多个使用+
let reg = /《(.+?)》/gi;
let result = message.matchAll(reg);
for (const item of result) {
console.log(item);
}
//通过下面的结果,可以知道,item[1]就是我们想要的结果
//匹配两个及以上的abc组合,abc不能匹配,abcabc可以匹配
let message = "afeuabchqwueabcabcwej";
let reg = /(abc){2,}/gi;
console.log(message.match(reg));
//若不加括号,则代表c出现两个或两个以上
(?<命名>)
let message = "《活着》、《传说》、《渴望》";
//书名号中的内容,可能出现任意字符,因此使用. 同时会有多个使用+
let reg = /《(?<zhang>.+?)》/gi;
let result = message.matchAll(reg);
for (const item of result) {
console.log(item);
}
有些时候,我们需要用捕获组指定匹配规则,但是并不希望它出现在最后的结果中
(?😃
let message = "《活着》、《传说》、《渴望》";
//书名号中的内容,可能出现任意字符,因此使用. 同时会有多个使用+
let reg = /(?:《)(?<zhang>.+?)(?:》)/gi;
let result = message.matchAll(reg);
for (const item of result) {
console.log(item);
}
//这样书名号就不会出现在结果中了
在正则表达式中,表达或的方式为 |
let reg = /(abc|cba|aaa)/
//匹配abc cba 或者aaa
//与[]不同的是,可以匹配一个组,而[]只能匹配单个字母
当我们得到歌词的字符串,我们需要将该字符串中的歌词提取出来,制作成数组对象中,每个对象包含歌词的时间和歌词的文本
let singWords =
"[00:02.144]若爱是但求开心 我问\n[00:06.028]要不要求其伤心\n[00:24.601]论尽半生不懂爱\n[00:29.689]回头没有心计划未来\n[00:34.637]才来独处好好检讨什么叫爱\n[00:42.024]你 便 来\n[00:45.259]混乱里结识到你\n[00:50.370]浪漫叫一切粉饰同盼待\n[00:55.422]某一刹骤觉 感情深得可爱\n[01:01.819]在倾吐那刻回响\n[01:07.210]感情从不是爱\n[01:13.869]若爱是但求终身 你问\n[01:19.098]怕只怕求其终生 被困\n[01:24.122]你宠爱父母亲\n[01:27.117]我为良朋怜悯\n[01:29.436]怎都算是个好人\n[01:34.486]若爱是但求衷心 我问\n[01:39.735]要不要求其忠心\n[01:45.302]纵双方理念多相同\n[01:49.267]却不相融\n[01:51.974]莫论配衬\n[02:11.071]再会时\n[02:13.995]没料到深深拥抱\n[02:18.942]合力擦出了火花和意外\n[02:24.300]某一刹幻觉恋情可一可再\n[02:30.669]在参透那刻回想\n[02:35.918]恋情全不是爱\n[02:42.288]若爱是但求终身 你问\n[02:47.603]怕只怕求其终生 被困\n[02:52.843]你工作觅满分\n[02:55.640]我为前途勤奋\n[02:58.306]怎可再另有心神\n[03:03.036]若爱是但求衷心 我问\n[03:08.366]要不要求其忠心\n[03:13.806]纵双方理念多相同\n[03:17.510]却不相融\n[03:20.253]莫论配衬\n[03:24.856]若爱是但求安心\n[03:29.521]怕只怕求其安稳\n[03:44.750]若爱是但求今生 抱憾\n[03:50.267]要不要求其他生\n[03:55.511]看双方各自的本能\n[03:59.350]爱的伤痕\n[04:02.376]极度配衬\n[04:06.438]爱七色五味多纷陈\n[04:10.791]更多灰尘\n[04:14.740]落入五蕴";
//先将歌词字符串,按照\n进行分割成数组,
let singArr = singWords.split("\n");
//设置获取时间的正则
let timeReg = /\[(\d{2}):(\d{2})\.(\d{3})\]/i;
//用于存储歌词时间的数组
let newSingWords = [];
//遍历歌词数组,提取其中的时间
for (const item of singArr) {
// console.log(item.match(timeReg));
let timeItem = item.match(timeReg);
//通过分钟*60*1000
//秒钟*1000
//毫秒,需要根据得到的长度进行判断,若为3位则*1,若为两位则*10
let minutes = timeItem[1] * 60 * 1000;
let seconds = timeItem[2] * 1000;
let mSeconds = timeItem[3].length === 3 ? timeItem[3] * 1 : timeItem[3] * 10;
let newTime = minutes + seconds + mSeconds;
//之后获取歌词
let content = item.replace(timeReg, "");
newSingWords.push({ newTime, content });
}
console.log(newSingWords);