1.在 im 中,聊天内容经常会遇到给对方发送链接地址的情况,请编写一道正则表达式,最大限度的匹配对方聊天内容中的 url。
// 举例: // Apple says: 今天我淘到了一个宝贝,你也看一下感觉很适合你 https://detail.tmall.com/item.htm?id=577359445691&spm=a1z10.10649-b-s.0.0.335e225cy94dcW ,种草的话,下单吧!
要求:仅仅识别 tmall.com 以及 taobao.com 这两个域名下的链接
主要考查正则匹配
function getUrlFromWords(text) {
let bool= /(https|http):\/\/[A-Za-z]+.((tmall.com)|(taobao.com))\/[A-Za-z]+.(htm|html)\?id=[0-9]+&spm=[a-zA-Z0-9.-]+/g
return bool.test(text)
}
2.写一个提取 URL 参数的 js 方法,例如:url="https://alibaba.com?a=1&b=2&c=3#/abc/def?a=2&b=3&c=4"
要求:只识别queryParam,排除 hash 的干扰
参这题如果是直接获取hash地址中的url参数可以直接调用 window.location.hash 而这里他给出了案例,我按着自己理解随意解了,如果有更好的方法可以评论下
funObj = (val) => {
let strs = val.split('&'), obj = {}
for (let i = 0; i < strs.length; i++) {
obj[strs[i].split('=')[0]] = strs[i].split('=')[1]
}
console.log('obj==>', obj)
}
function getParamFromURL(url) {
if (url.indexOf('#') !== -1) {
// 一种#的前面有? ,一种#前面没?没参数
if (url.indexOf('?') !== -1) {
if (url.indexOf('#') > url.indexOf('?') && url.indexOf('?') != url.lastIndexOf('?')) {
// #的前面有?
let str = url.substr(url.indexOf('?')+1, url.indexOf('#')+1)
let str2 = url.substr(url.lastIndexOf('?')+1)
console.log('str==>',str, 'str2==>',str2)
funObj(str)
funObj(str2)
}
if (url.indexOf('#') < url.indexOf('?') ) {
// #前面没?没参数
let str = url.substr(url.indexOf('?')+1)
console.log(str)
funObj(str)
}
}
}
}
3.宏任务、微任务(这里只考察了宏任务与微任务分别是哪些,我扩展了执行顺序)
执行顺序: 先宏后微
宏任务(发起者:宿主(Node、浏览器)):
script(整体代码)、setTimeout、setInterval、setImmediate(Node.js 环境)、UI事件、I/O(Node.js)
微任务(发起者: JS引擎):
Promise、MutaionObserver、process.nextTick(Node.js)
(简单说下promise对象:表示一个异步操作的最终完成.then (或失败.catch)及其结果值,then和catch都会返回一个函数,函数中的参数为结果值此次执行的结果值 )
注意:1.promise构造函数是同步执行,then方法是异步执行
2.微任务(入队的Promise回调)的优先级高于宏任务(入队的setTimeout()回调)
先了解下事件循环(Event Loop)运行机制再看案例:
- 执行一个宏任务(栈中没有就从事件队列中获取)
- 执行过程中如果遇到微任务,就将它添加到微任务的任务队列中
- 宏任务执行完毕后,立即执行当前微任务队列中的所有微任务(依次执行)
- 当前宏任务执行完毕,开始检查渲染,然后GUI线程接管渲染
- 渲染完毕后,JS线程继续接管,开始下一个宏任务(从事件队列中获取)
案例:
setTimeout(() => {
console.log("4");
setTimeout(() => {
console.log("8");
}, 0);
new Promise((r) => {
console.log("5");//构造函数是同步的
r();
}).then(() => {
console.log("7");//then()是异步的,这里已经入队
});
console.log("6");
}, 0);
new Promise((r) => {
console.log("1");//构造函数是同步的
r();
}).then(() => {
console.log("3");//then()是异步的,这里已经入队
});
console.log("2");
总结: 在执行 宏任务
之前,要先把已入队的 微任务
全部执行完,再执行下一条 宏任务