前端笔试模拟练习题

1.在实际项目中使用$nextTick好,还是用setTimeout好?
首先来讲一下他们的区别:
nextTick:在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。简单点说就是DOM更新后会执行的一个回调方法
setTimeout:只是延迟执行,在延迟执行的方法里,DOM有可能会更新也有可能没有更新。
常规做法就是延迟500ms或者1s
2.前端如何判断chrome版本并引入不同js?
function include(filename)

{

    var head = document.getElementsByTagName('head')[0];

    var script = document.createElement('script');

    script.src = filename;

    script.type = 'text/javascript';

    head.appendChild(script)

}

function getChromeVersion () {     

    var raw = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);

    return raw ? parseInt(raw[2], 10) : false;

}

var chromeVersionNo = getChromeVersion();

if(chromeVersionNo < 79){

include('你的1.js');

}else{

include('你的2.js');

}
3.vue.js 怎么解决跨域?
方法一:proxy
 
vue.config.js

module.exports = {

 devServer: {

  proxy: {

    "/prefix": {

      target: "targetDomain",

      changeOrigin: true,

      pathRewrite: {"^/prefix": ""}

    }

  }

}

}
方式二:nginx
nginx.conf
location /prefix {
  proxy_pass targetDomain
}
方式三:jsonP
详见:JSONP跨域详解
方式四:hosts代理
通过改变hosts进行信任调用,设置与后台同domain即可
 

3.如何动态将option选框中的值传入前一个input节点

function handleChange(e){
    e.target.previousElementSibling.value = e.target.value
}

4.如何将监听事件改为promise的形式

Promise就像一个状态机,而且是一个状态不可逆的状态机,这就意味它只会在到达Fullfiled或者Rejected状态时会执行你注册的函数

例子:function receiver(type) {
  const listeners = [];

  const listen = {
    then(callback) {
      listeners.push(callback);

      return listen;
    }
  };
  document.addEventListener(type, async (ev) => {
    let acc = ev;
    for (let i = 0; i < listeners.length; ++i) {
      acc = await listeners[i](acc);
    }
  });

  return listen;
}

receiver("click")
  .then((e) => {
    console.log(e);

    return 1;
  })
  .then((v) => {
    console.log(v);
  });