莫莫哒的面试实录

226 阅读6分钟

⛔腾讯金融(深圳)

###Vue数据绑定

参考文档:

  1. cn.vuejs.org/v2/guide/re…
  2. juejin.cn/post/684490…
  3. juejin.cn/post/684490…
  4. juejin.cn/post/684490…

###请求的几种方式

###异步请求是否会受到跨域限制

###跨域解决方案

###了解过async/await吗

###了解websocket吗

  1. juejin.cn/post/684490…

###如何实现jQuery的链式调用

###事件流

###事件循环

latentflip.com/loupe/

###源码了解过哪些

⛔腾讯看点(深圳)

###实现正方形的拖放

H5 API

主要可分为两类API:容器类和目标类

容器类API: dragenter、dragover、dragleave、drop

目标类API:dragstart(以及为目标添加属性"draggable")

延伸: touch触屏事件:touchstart/touchmove/touchend

###ajax请求实现(详细)

###状态码有哪些

参考文档: H5 拖放实现

状态码说明
UNSEND 0未发送(创建一个XHR,初始状态是0)
OPENED 1已经打开(执行了xhr.open)
HEADERS_RECEIVED 2响应头信息已经返回给客户端(发送请求后,服务器会依次返回响应头和响应主体的信息)
LOADING 3等待服务器返回响应内容
DONE 4响应主体信息已经返回给客户端

参考文档: juejin.cn/post/684490…

###浏览器缓存

###Vue数据双向绑定(还行)

###DOM diff(深度不够,考虑对自己的项目有什么影响)

主要参考:

  1. 主流程:juejin.cn/post/686410…
  2. updateChildren: mp.weixin.qq.com/s/pd0Mshl-f…

其他:

  1. juejin.cn/post/684490…
  2. www.zhihu.com/search?type…
  3. www.zhihu.com/search?type…
  4. segmentfault.com/a/119000002…
  5. segmentfault.com/a/119000002…

###Vue 3.0了解过吗

###了解或使用过哪些优化策略

###如何分析网页性能(例如首页加载速度)

###了解fetch吗

参考资料: www.yuque.com/alien-ax3ws…

###了解过service worker吗

参考资料: juejin.cn/post/684490…

###了解过哪些前端新技术(web assembly)

⛔天猫海外事业部(杭州)

###如何在视窗内加载一个图片,有思路吗(如果API不熟悉,就说一个概括性的思路)

www.jb51.net/article/104…

###所有事件都有捕捉阶段吗

根据标准文档,事件(Event)对象的分发传播路径(propagation path)如下图所示: EventFlow 总共会经历三个阶段: capture(e.eventPhase为1)->target(e.eventPhase为2)->bubble(e.eventPhase为3)。目标阶段即为传播路径的底部。 load event

Event的bubbles属性决定事件是否跳过冒泡阶段,或者进行手动控制e.stopPropagation()/e.stopImmediatePropagation(),停止事件对象的传播。 cancelable属性决定事件行为是否可取消。

标准文档中列举的几类事件: UI事件:load/unload/abort/error/select

Focus事件:blur/focus/focusin/focusout

Mouse事件:click/dblclick/mousedown/mouseenter/mouseleave/mouseeenter/mousemove/mouseout/mouseover/mouseup

Wheel事件:wheel

Keyboard事件:beforeinput/input

Composition事件:compositionstart/compositionupdate/compositionend 处理非拉丁字符输入事件(测试后发现无法处理混合输入情况)

参考资料:

  1. DOM事件模型W3标准文档
  2. CompositionEvent实例:实现一个依据用户输入首字符实时搜索(过滤)功能

###setTimeout为什么不准

setInterval

周期性循环定时器

最短时间间隔是10ms

setTimeout

单次定时器,通过循环调用也可以实现循环定时

最短延迟事件为4ms 为了节电,对于那些不处于当前窗口的页面,浏览器会将最短延时限制扩大到1000ms。

function timer() {
	// do something
    console.log("tick")
	setTimeout(timer, 1000)
}
timer()

setTimeout设定的延时其实是其回调函数从定时(定时由浏览器控制)开始加入到callback queque的时间

为什么不准时,可以看到下面这个例子(援引自这篇掘金)

<body>
    <button id="btn"></button>
    <script>
        const btn = document.getElementById("btn");
        btn.addEventListener('click',function handleClick(){
            //...代码执行时间需80ms
        })
    	setTimeout(function handlerTimeout(){
            //...代码执行时间需60ms
        }, 100);
        setInterval(function handlerInterval(){
            //...代码执行时间需80ms
        },100)
        //... 其余代码执行时间需要180ms
    </script>
</body>

###CSS三角形怎么画

 #tri {
    width: 0;
    border-left: 50px solid transparent;
    border-top: 100px solid hsl(271, 76%, 53%);
    border-right: 50px solid transparent;
}

###栈、队列、链表区别,使用场景

链表:内存不连续

优点:大小动态扩展,插入删除效率高(只需要更改一下指针指向)

缺点:不能随机访问(没有存储位置推算公式,不能用下标访问)

使用场景:对于数据的规模难以估计,频繁进行插入删除操作

与链表互补的存储结构是数组,不过js中的数组并不是连续存储的

栈:

可基于数组和链表实现

是一种操作受限(先进后出)的线性表

使用场景:

  1. 浏览器前进后退
  2. 函数调用栈

队列:

可基于数组和链表实现

同样也是一种操作受限(先进先出)的线性表

使用场景:

  1. 任务队列
  2. 消息队列

###箭头函数和普通函数的区别

  1. 语法更精简
  2. 没有原型
  3. 没有自己的this,而是继承其外层普通函数的this;且定义时确定,指向不能改变
  4. 因为没有自己的this,所以不能作为构造函数
  5. 不绑定arguments
let f1 = () => { console.log(arguments) }
// 如果想要获取参数列表可以使用扩展符
let f2 = (...args) => { console.log(...args) }
  1. 箭头函数不能作Generator函数,不能使用yield关键词

###如何发送跨域post请求

CORS:Cross-Origin Resource Sharing 跨域资源共享 CORS本质就是通过将响应头Access-Control-Allow-Origin的值设置成请求方的域名即可 注意:

  1. postMessage是跨窗口通信
  2. websocket是新的传输协议

✅字节平台研发(北京)一面

###第一题:let const var 闭包相关

下列代码的执行结果是什么

var a = 10;
(function(){
	console.log(a) // undefined
    a = 5
    var a = 20
    console.log(a) //  20
    console.log(this.a) // 10
})()

分析:上面的代码有两个作用域,全局和函数

// 1. 全局作用域
var a = 10; // 全局变量
(function(){
	// 2. 局部作用域
	console.log(a) // 本地变量提升:undefined
    a = 5 //本地变量
    let a = 20 // 本地变量声名赋值
    b = 999 // 全局对象(如window)属性
    console.log(a) //  20
    console.log(this.a) // 10
})()

涉及知识点:全局和函数作用域、暂时性死区、this指向、立即执行函数、变量提升、定义变量是否使用var 分析:

  1. 使用var声明的变量会发生变量提升
  2. 变量x赋值时如果不使用var,则视为全局对象上创建属性x(属性赋值和变量声明的区别在于,变量自带不可删除性,即无法使用delete关键字删除var声明的变量)
  3. 使用let绑定的变量会出现暂时性死区,若在声明前访问会报ReferenceError

###闭包

下面代码的输出结果

for(var i=0; i<3; i++) {
    setTimeout(() => {
        console.log(i)
    },0)
}

用闭包改成正确的代码

注意:setTimeout返回一个数字

错误答案

for(var i=0; i<3; i++) {
    (setTimeout(() => {
        console.log(i)
    },0))(i)
}

正确答案

for(var i=0; i<3; i++) {
    ((i) => {
          setTimeout(() => {
          console.log(i)
    	},0)})(i)
}

解释:用一个函数包住setTimeout,立即执行函数的前提是这是一个函数

###如何删除cookie

###说一下XSS(Cross Site Scripting)

###CSS:说一下盒模型、position

###数据类型有哪些

###判断数据类型的方法

###new的实现原理

###HTTP缓存

###vue的数据双向绑定

简化说明:Object.defineProperty+关注订阅模式 juejin.cn/post/684490…

###算法题:合并分区(力扣原题)

✅字节平台研发(北京)二面

###网页的渲染流程

###script的async和defer的差别

###用callback和Promise两种方式实现XHR

###盒模型的概念

###flex布局

###CSS3的transform和animation了解过吗

###script的async和defer的差别

###事件绑定onclick和addEventListener

###箭头函数和普通函数的区别

###重绘重排

###代码实现

  1. 创建列表
const list  = [
    { id , text, message },
    ....5
]
通过一个JS,去循环这个list,在一个id为 wrapper 的 div 下,建立一个列表
div #id {text} click = alert(message)
  1. 数对和
输入 list = [5, 6, 5] target = 11
输出 [ [5, 6] ]

输入 list = [5, 6, 56] target = 11
输出 [ [5, 6], [5, 6] ]

⛔华为一二面(无前端 岗位不匹配)

一面

###查找频率前K高的数

###实现一个栈(作为共用库的时候如何应对高并发)