前端面试题(一)

1:实现一个函数判断是不是回文字符串

function run(input) {
    if(typeof input !== "string")
        return false
    return
input.split('').reverse().join('') === input;
    //input.split('')可以把字符串变成数组
}

2:两种以上方式实现已知或者未知宽度的垂直水平居中

//已知宽高

.box{

                                  height: 400px;

                                  width: 400px;

                                  background-color: #808080;

                                  position: relative;

                         }

扫描二维码关注公众号,回复: 4735126 查看本文章

                         .box1{

                                  height: 100px;

                                  width:  100px;

                                  background-color: red;

                                  position: absolute;

                                  left: 0;

                                  right: 0;

                                  top: 0;

                                  bottom: 0;

                                  margin: auto;

                         }

//

.box{

                                  height: 400px;

                                  width: 400px;

                                  background-color: #808080;

                                  position: relative;

                         }

                         .box1{

                                  height: 100px;

                                  width:  100px;

                                  background-color: red;

                                  position: absolute;

                                  left:50%;

                                  top: 50%;

                margin-left: -50px;

                margin-top: -50px;

                         }

//未知宽高 transform: translate3d(-50%,-50%,0);

3D变化,-50%表示的是当前元素的50%

.box{

                                  height: 400px;

                                  width: 400px;

                                  background-color: #808080;

                                 position: relative;

                         }

                         .box1{

                                  height: 100px;

                                  width:  100px;

                                  background-color: red;

                                  position: absolute;

                                  left:50%;

                                  top: 50%;

                transform: translate3d(-50%,-50%,0);

                         }

//flex布局

.box{

                                  height: 400px;

                                  width: 400px;

                                  background-color: #808080;

                                  display: flex;

                                  justify-content: center;

                                  align-items:center

                         }

                         .box1{

                                  height: 100px;

                                  width:  100px;

                                  background-color: red;

                        

                         }

3:实现效果,点击容器内的图标,图标边框变成border 1px solid red,点击空白处重置。

Const box = document.getElementById('box');

function isIcon(target) {

return target.className.includes('icon')

}

box.onClick = function(e) { e.stopPropagation();

const target = e.target;

if (isIcon(target)) {

    target.style.border = '1px solid red'

  }

}

Const doc = document;

doc.onclick = function(e) {

const children = box.children;

for(let i; i < children.length; i++) {  

if (isIcon(children[i])) {

      children[i].style.border = 'none'

    }

  }

}

4:实现简单的双向数据绑定mvvm

<input type="text" id="input">

const data = {};
const input = document.getElementById("input");
input.onchange = e =>{
    let target = e.target;
    data.text = target.value;
}

Object.defineProperty(data,'text',{
     set(value){
         input.value = value;
         this.value = value;
     }

})

 

5: 实现Storge,使得该对象为单例,并定于localStroage进行封装设置数值setitem(key,value),

Getitem(key);

class Store{
     constructor(){

     }

     static getInstance(){
         if(!Store.instance){
             Store.instance = new Store();
         }
         return Store.instance
    
}

     set=(key,value) =>{
         localStorage.setItem(key,value);
     }

     get = (key)=>{
        return localStorage.getItem(key);
     }

}

6:事件循环机制event loop

    首先,js是单线程的,主要的任务是处理用户的交互,而用户的交互无非就是响应DOM的增删改,使用事件队列的形式,一次事件循环只处理一个事件响应,使得脚本执行相对连续,所以有了事件队列,用来储存待执行的事件,那么事件队列的事件从哪里被push进来的呢。那就是另外一个线程叫事件触发线程做的事情了,他的作用主要是在定时触发器线程、异步HTTP请求线程满足特定条件下的回调函数push到事件队列中,等待js引擎空闲的时候去执行,当然js引擎执行过程中有优先级之分,首先js引擎在一次事件循环中,会先执行js线程的主任务,然后会去查找是否有微任务microtask(promise),如果有那就优先执行微任务,如果没有,在去查找宏任务macrotask(setTimeout、setInterval)进行执行。

事件循环,先执行宏任务,其中同步任务立即执行,异步任务,加载到对应的的Event Queue中(setTimeout等加入宏任务的Event Queue,Promise.then加入微任务的Event Queue),所有同步宏任务执行完毕后,如果发现微任务的Event Queue中有未执行的任务,会先执行其中的任务,这样算是完成了一次事件循环。接下来查看宏任务的Event Queue中是否有未执行的任务,有的话,就开始第二轮事件循环,依此类推。

7: 事件流

事件流分为两种,捕获事件流和冒泡事件流。

捕获事件流从根节点开始执行,一直往子节点查找执行,直到查找执行到目标节点。

冒泡事件流从目标节点开始执行,一直往父节点冒泡查找执行,直到查到到根节点。

事件流分为三个阶段,一个是捕获节点,一个是处于目标节点阶段,一个是冒泡阶段。

8:有一个数组【1,2,3,4】实现数组的全排列

  //算法自行搜索

9:输入url看到页面的发生的全部过程,越详细越好

首先浏览器主进程接管,开了一个下载线程。

然后进行HTTP请求(DNS查询、IP寻址等等),中间会有三次捂手,等待响应,开始下载响应报文。将下载完的内容转交给Renderer进程管理。

Renderer进程开始解析css rule tree和dom tree,这两个过程是并行的,所以一般我会把link标签放在页面顶部。

解析绘制过程中,当浏览器遇到link标签或者script、img等标签,浏览器会去下载这些内容,遇到时候缓存的使用缓存,不适用缓存的重新下载资源。

css rule tree和dom tree生成完了之后,开始合成render tree,这个时候浏览器会进行layout,开始计算每一个节点的位置,然后进行绘制。

绘制结束后,关闭TCP连接,过程有四次挥手。

10:三次握手和四次挥手

为什么要三次挥手?

  在只有两次“握手”的情形下,假设Client想跟Server建立连接,但是却因为中途连接请求的数据报丢失了,故Client端不得不重新发送一遍;这个时候Server端仅收到一个连接请求,因此可以正常的建立连接。但是,有时候Client端重新发送请求不是因为数据报丢失了,而是有可能数据传输过程因为网络并发量很大在某结点被阻塞了,这种情形下Server端将先后收到2次请求,并持续等待两个Client请求向他发送数据...问题就在这里,Cient端实际上只有一次请求,而Server端却有2个响应,极端的情况可能由于Client端多次重新发送请求数据而导致Server端最后建立了N多个响应在等待,因而造成极大的资源浪费!所以,“三次握手”很有必要!

  为什么要四次挥手?

  试想一下,假如现在你是客户端你想断开跟Server的所有连接该怎么做?第一步,你自己先停止向Server端发送数据,并等待Server的回复。但事情还没有完,虽然你自身不往Server发送数据了,但是因为你们之前已经建立好平等的连接了,所以此时他也有主动权向你发送数据;故Server端还得终止主动向你发送数据,并等待你的确认。其实,说白了就是保证双方的一个合约的完整执行!

  使用TCP的协议:FTP(文件传输协议)、Telnet(远程登录协议)、SMTP(简单邮件传输协议)、POP3(和SMTP相对,用于接收邮件)、HTTP协议等。

猜你喜欢

转载自www.cnblogs.com/love-life-insist/p/10204637.html