Giter Club home page Giter Club logo

front-end-interview's Introduction

front-end-interview

GitHub issues GitHub last commit

HTML

  1. HTML里常见的单位[★★]
  2. video标签会预加载视频吗[★]

CSS

  1. CSS盒模型[★]
  2. 如何实现盒子水平垂直居中[★★★★]
  3. 左边固定,右边自适应的布局(尽可能多的方法)[★★★]
  4. 选择器排序[★]
  5. 怎么实现动画一个元素从左滑到右[★★]
  6. inline、inline-block、block的区别[★★★]
  7. 外边距重叠[★★]
  8. src和href区别[★]

JavaScript

  1. 什么是闭包[★★★★★]
  2. 关于闭包的应用题[★]
  3. undefined和null区别[★★]
  4. JavaScript中怎么判断相等[★]
  5. let const var的区别[★★★★]
  6. JavaScript的基本数据类型+ES6新增[★★★]
  7. 箭头函数相关[★★]
  8. this指向/变量声明提升/作用域链问题[★]
  9. 匿名函数(自执行函数IIFE)的作用是什么[★]
  10. 数组去重[★]
  11. Promise的串行调用[★★]
  12. 原型链/原型链继承[★★★]
  13. 封装个可以检测所有数据类型的函数[★]
  14. 每隔一秒打印数组里的元素[★★]
  15. 实现数组的扁平化[★]
  16. async函数与Promise的区别[★]
  17. JavaScript文件在HTML文件里的执行顺序[★]
  18. 有哪些方式可以判断是否是数组[★★]
  19. 设计模式[★]

ES6

  1. 箭头函数相关[★★]
  2. 数组去重[★]
  3. let const var的区别[★★★★]
  4. JavaScript的基本数据类型+ES6新增[★★★]
  5. 发布订阅模式[★]
  6. 实现Promise的all方法[★]

DOM/BOM/事件

  1. DOM事件的捕获、冒泡和委派[★★]
  2. 实现图片懒加载[★★]
  3. 脚本如何全局检测错误[★]
  4. 如何监听input里内容的改变[★]
  5. 事件的target/currentTarget的区别[★★]

浏览器

  1. 浏览器的进程[★]
  2. CSS和JS文件阻塞浏览器页面加载吗[★★]
  3. 宏任务和微任务的区别[★]
  4. cookie/session/SessionStorage和LocalStorage区别[★★★]

Vue

  1. Vue的响应式(双向绑定)原理[★★★★]
  2. 对virtual DOM的理解[★]
  3. 讲一下nextTick的原理[★]
  4. Vue生命周期[★★★]
  5. computed和watch[★★]
  6. 讲一下vuex[★★★]
  7. Vue和React的区别是什么[★]
  8. Vue中key的作用[★★★]

React

  1. 对virtual DOM的理解[★]
  2. React里key的作用[★]

计算机网络

  1. TCP/UDP区别[★★]
  2. 怎么实现跨域[★★]
  3. 讲一下HTTP的缓存[★]
  4. HTTP状态码301和302[★★]
  5. HTTP状态码304[★★]
  6. TCP的慢启动算法[★]
  7. 输入URL到浏览器显示页面的过程[★★]
  8. HTTP1.0/1.1/2.0/3.0[★★★]

工程模块+webpack

  1. 模块化规范[★]

算法

  1. 版本号排序[★]
  2. 复原IP地址[★]
  3. 两个二维矩阵相乘[★]
  4. 数组去重[★]
  5. 写快排[★]
  6. 合并有序数组[★★]
  7. 实现数组的扁平化[★]
  8. 找出字符串中第一个不重复的字符[★]
  9. 合并两个有序链表[★]
  10. 买卖股票的最佳时机[★]
  11. 二叉树后序遍历[★★]
  12. 合并区间[★]
  13. 字符串数字相加[★]
  14. 随机数(洗牌算法)[★]
  15. 实现trim功能[★]
  16. 类似逆波兰表达式的题[★★]
  17. 十进制转二十六进制[★]
  18. 找出位置连续的最长递增序列[★]
  19. 二叉搜索树的第K大的值[★]

建议

面试建议!必看[★★★★★]

新开的仓库

基于JavaScript实现的算法总结

front-end-interview's People

Contributors

liqiuyue9597 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

front-end-interview's Issues

关于闭包的程序题

var result = []
var a = 3
var total = 0
function foo(a) {
  var i = 0
  for (; i < 3; i++) {
    result[i] = function () {
      total += i * a
      console.log(total)
    }
  }
}
foo(1)
//下面都输出什么
result[0]()
result[1]()
result[2]()

讲一下HTTP的缓存

强缓存/协商缓存 --> 304状态码 --> cache-control和Expire怎么设置(怎么用)

Promise的串行调用

let arr = [()=>{ return new Promise(res=>{ console.log("run1", Date.now()); res() }) }, ()=>{ return new Promise(res=>{ console.log("run2", Date.now()); res() }) },()=>{ return new Promise(res=>{ console.log("run3", Date.now()); res() }) }]
写一个函数实现Promise串行调用,按顺序输出run1,run2,run3

function promiseRun(arr) {
       (function iter(){
		if(arr.length) arr.shift()().then(iter)
	})()

}
//另一种
function promiseRun(arr) {
    let res = Promise.resolve();
	arr.forEach(fn=>{
		res = res.then(()=>fn()) // 关键是 res=res.then... 这个逻辑
	})
}
}

Promise提供的方法有.all.race都是并行执行。
一般用async awit就能够串行执行,而且非常简洁明了。

Vue的响应式(双向绑定)原理

Vue的响应式(双向绑定)原理 --> Object.defineProperty的缺点(数组怎么解决响应式的) -->怎么解决data未定义的值不会响应(Vue.set) --> Vue3怎么解决的

数组去重

这道题不是一般的数组去重。。。
arr=[undefined, undefined, null, null, true, false, 'true', NaN, NaN, 'NaN', {}, {}, [], [], -0, 1, 0]
对这样一个arr去重
题解发在掘金上了。

匿名函数(自执行函数IIFE)的作用是什么

在 IIFE 中所建立的变量,都不会影响到全局执行上下文所建立的变量。也就是说放在 IIFE 里面的变量,并不会影响到其他外层的变量,也不会被外层的变量影响。

一道经典的面试题就需要IIFE解决。
按照顺序每隔一秒打印数组的元素。

var arr = [1,2,3,4,5]
for(var i=0; i<arr.length; i++){
  (function(index){
    setTimeout(function(){
      console.log(arr[index])
    },1000) 
  })(i)
}

怎么实现跨域

这类题一般都是连锁问

实现跨域的几种方法 --> 什么是CORS同源策略 --> 响应头要怎么设置才能跨域成功
     |                          |--->怎样算跨域(域名、端口号和协议)
     |--->websocket实现跨域的原理  

模块化规范

我自己是只知道common JSES6的模块化规范,至于AMDCMD我没用过就直接没说。问题不大。

  1. requireimport的区别等等常规问题
  2. require如何解析路径

HTTP状态码301和302

301和302是什么 --> 区别是什么 --> 302可以用在什么场景(登录跳转等)

原型链/原型链继承

什么是原型链 --> 原型链继承(弊端) --> 解决办法(object.creat()寄生组合式继承 和 ES6的extends)

DOM事件的捕获、冒泡和委派

首先讲事件的捕获和冒泡

代码题:
有上万个<li>标签,实现点击显示<li>标签里的内容

  <ul class="show">
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
  </ul>

解题思路:用事件委派实现,不要傻傻地想着给每个<li>绑定事件。
事件委托:将事件统一绑定给元素的共同祖先元素。当后代元素上的事件触发时,会一直冒泡到祖先元素,进而实现只绑定一次事件可应用到多个元素上。

var ulList = document.getElementsByClassName('show')[0]

ulList.addEventListener('click', function(e){
  if(e.target.tagName === 'LI'){
    console.log(e.target.innerHTML)
  }
})

写的时候面试官顺带问e.targete.currentTarget区别
e.target是指的触发当前事件的标签
e.currentTarget指的是绑定事件的标签(所以不会变)

选择器排序

  1. !important
  2. 内联样式
  3. id选择器
  4. 类选择器
  5. 元素选择器

::after是伪元素还是伪类? (伪元素) --> 可以用来做什么

HTML里常见的单位

面试官问的是HTML里的单位,其实HTML只有标签没有单位,这个单位的知识应该属于CSS

相对长度单位 说明
em 相对于当前对象内文本的字体尺寸
px 像素,最常用,推荐使用
绝对长度单位 说明
in 英寸
cm 厘米
mm 毫米
pt

--> 解释rem和em
rem:相对于根元素(即html元素)font-size计算值的倍数

图片的懒加载怎么实现

我回答:预先将图片链接放到data-url属性,如果图片到页面的高度相等就把图片的src赋值为data-url里的地址....等等等
面试官说这个方法会引起回流,还有没有其他方法。。。。

箭头函数相关

字节:

var x = 1
//说出输出
x => x 
x => {x} 
x => ({x}) 
x => {{x}}

百度:

  • 讲一下箭头函数的this
  • 箭头函数可以写成构造函数吗?
  • 箭头函数有原型吗/可以实现原型链吗?

CSS和JS文件阻塞浏览器页面加载吗

1.CSS不会阻塞DOM解析,但是会阻塞DOM渲染;CSS阻塞JS执行,但不会阻塞JS文件下载
2.JS阻塞DOM解析,也就是JS会阻塞页面加载 --> script标签里的asyncdefer属性 --> DOMContentLoadedload事件区别
因为浏览器设置JS引擎线程GUI渲染线程是互斥的,所以JS肯定会阻塞页面加载。

因为我第二点回答错了,面试官就问我渲染进程里有哪些线程,尝试引导我。

算法:复原IP地址

leetcode 93题 中等难度

给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。
有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 '.' 分隔。
示例:
输入: "25525511135"
输出: ["255.255.11.135", "255.255.111.35"]

这道题在字节的前端面试算法里考察的频率非常高

inline、inline-block、block的区别

block:独占一行,可以设置宽高
inline:不会独占一行,不能设置宽高
inline-block:不会独占一行,能设置宽高。比如<img>和<input>.
通常会引申到:margin和padding能对行内元素设置吗?

行内元素:

  • 行内元素不会自动换行,设置宽高无效
  • 行内元素设置margin和padding左右有效,上下无效

什么是闭包

这道题是真的是一道比较经典的考题
闭包涉及:

  1. 执行环境(全局和局部)
  2. 环境栈
  3. 作用域和作用域链 -->ES6有块级作用域
  4. 垃圾回收/内存泄漏

字节的一道题:(如果不懂闭包很难做出来)
闭包的应用题

浏览器的进程

浏览器有哪些进程 --> 渲染进程里有哪些线程
进程:一个浏览器主进程(Brower Process)、一个GPU进程、一个网络进程、多个渲染进程和多个插件进程。

  • 浏览器主进程
  • 渲染进程
  • GPU进程
  • 网络进程
  • 插件进程

渲染线程:

因为当时紧张嘴瓢,先问的我线程,我答的是浏览器的进程。然后面试官就说那你给我讲一下进程和线程的区别。

this指向/变量声明提升/作用域链问题

function a(){
    this.b = 3
}
var c = new a()
a.prototype.b = 7
var b = 9
a()

//说出输出什么
console.log(b) 
console.log(c.b) 
var a=33;
function test(){
  console.log(a)
  var a='eee'
}
test() //输出什么
window.name = 'bytedance'
function A() {
this.name = '123'
}
A.prototype.getA = function () {
console.log(this)
return this.name + 1
}
let a = new A()
let funcA = a.getA
//输出什么
funcA() 
a.getA() 

算法:版本号排序

versions是一个项目的版本号列表,因多人维护,不规则 var versions=['1.45.0','1.5','6','3.3.3.3.3.3.3'] 要求从小到大排序,注意'1.45'比'1.5'大 。var sorted=['1.5','1.45.0','3.3.3.3.3.3','6']

每隔一秒打印数组里的元素

第一秒输出1,第二秒输出4。。。
a = [1, 4, 5, 7, 9];

//第一种
for (let i in a) {
  setTimeout(() => {
    console.log(a[i]);
  }, i * 1000 + 1000);
}

//第二种
function sleep(time) {
  return new Promise((resolve, reject) => {
    setTimeout(resolve, time);
  });
}

(async function test(arr) {
  for (var i in arr) {
    await sleep(1000);
    console.log(a[i]);
  }
})(a);

HTTP状态码304

304 --> 讲一下协商缓存 --> Etag和Last modified的区别 --> 服务器怎么设置不要强缓存(cache-control:no-store 注意no-store与no-cache的区别)
因为浏览器缓存分为强缓存(cache-control和expires)和协商缓存(Etag/if-none-match和Last-modifined/if-modified-since),所以面试官就串着把问题问了

脚本如何全局检测错误

我回答try catch,面试官不满意。
Event对象有一个onerror事件,支持onerror的JavaScript对象只有imgwindow。所以面试官应该是想听我说window.onerror全局检测错误。

怎么实现动画一个元素从左滑到右

  1. tansform (to change the form of sth 使改变形态):
    • 平移:translateX/Y/Z(平移元素,百分比是相对于自身计算的)
    • 缩放: scaleX/Y/Z
    • 旋转: rotateX/Y/Z
  2. animation
  3. transition(过渡)
    都可以实现。然后面试官问我:tansform 和animation 哪个性能更好

--> tansform更好,因为transform避免布局Layout与绘制paint(回流和重绘那一块的知识)

TCP的慢启动算法

面试官其实是怕我不知道TCP拥塞控制,所以先问我知道TCP慢启动算法吗。
然后就讲一下TCP拥塞控制的过程:

  1. 慢启动算法:有小到大指数增长发送数据量;每收到一个报文确认就继续增长一次。(指数增长)
  2. 拥塞避免算法:维护一个拥塞窗口的变量;只要网络不拥塞就试探将拥塞窗口调大。(加1)

let const var的区别

ES6里新增的定义变量方式有哪些 --> let const var的区别 --> const定义的变量哪种情况下能修改 -->真正固定变量的命令(Obeject.freeze)

宏任务和微任务的区别

  1. 宏任务:当前调用栈中执行的代码成为宏任务(主代码块,定时器等等)。
  2. 微任务: 当前(此次事件循环中)宏任务执行完,在下一个宏任务开始之前需要执行的任务,可以理解为回调事件(promise.then,proness.nextTick等等)。
  3. 宏任务中的事件放在task queue中,由事件触发线程维护;微任务的事件放在微任务队列中,由JS引擎线程维护。

运行机制

  1. 在执行栈中执行一个宏任务。

  2. 执行过程中遇到微任务,将微任务添加到微任务队列中。

  3. 当前宏任务执行完毕,立即执行微任务队列中的任务。

  4. 当前微任务队列中的所有任务执行完毕后。检查渲染,GUI线程接管渲染。

  5. 渲染完毕后,JS线程接管,开启下一次事件循环,执行下一次宏任务(事件队列中取)。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.