阿里面试题

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)运行机制再看案例:

  1. 执行一个宏任务(栈中没有就从事件队列中获取)
  2. 执行过程中如果遇到微任务,就将它添加到微任务的任务队列中
  3. 宏任务执行完毕后,立即执行当前微任务队列中的所有微任务(依次执行)
  4. 当前宏任务执行完毕,开始检查渲染,然后GUI线程接管渲染
  5. 渲染完毕后,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");

在这里插入图片描述

 总结: 在执行 宏任务 之前,要先把已入队的 微任务 全部执行完,再执行下一条 宏任务

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值