美文网首页
面试题目整理

面试题目整理

作者: 那个大螺丝 | 来源:发表于2020-08-23 22:53 被阅读0次

HTML题目

  • HTML5 中有哪些语意化标签,都有什么用
    例如导航链接, 头部, 以及尾部等。用来明确一个Web页面的不同部分,能够清楚的描述其意义给浏览器和开发者。
<header>  <nav> <section> <article> <aside> <figcaption> <figure> <footer>
  • 有哪些标签是属于块级元素的
<div> <h1>  <p>  <ul>  <table>
  • 内联块有什么特性,和块级元素、行内元素有什么不同

默认情况下,行内元素不会以新行开始(无法设置宽高上下外边距),而块级元素会新起一行)。
内联块同时具有区块和行内元素的特点(不会另起一行、但是可以设置宽高外边距)


CSS题目

  • css 常用选择器有哪些,优先级如何
    • 标签选择器、类选择器、ID 选择器
    • id选择器 > 类选择器 > 标签选择器
  • 伪类/伪元素选择器有哪些
:hover                   
:active                
:frist-child            
:last-child        
::before
::after
  • em / rem 单位属性的意思
    • 浏览器的默认字体都是16px,那么1rem=16px
    • rem 则是从根节点开始,计算字体的大小
  • display:flex,使用该属性后,当前节点下元素会有发生什么变化
    • 所有元素变成flex item,所有元素按照主轴方向排列,每个元素可以自由设置宽度高内外边距,元素默认不换行,过长的元素会按比例压缩
    • 子元素的float、clear和vertical-align属性将失效。
  • flex 布局中默认主轴和相交轴的方向是怎样的, 如何改变他们的方向
    • 默认情况主轴横向,相交轴竖直方向
    • flex-direction 属性可以改变主轴的方向,相交轴自动与主轴垂直
  • flex:1 该属性是什么意思,在什么场景下会使用,flex简写包含了那几属性
    • 会被识别为 flex-grow:1,元素会按比例充满父级元素的内部
    • 一般会在平均分配元素空间的时候用到
    • flex是一个简写属性,用来设置 flex-grow, flex-shrink 与 flex-basis
  • flex-shrink属性有什么作用
    • flex-shrink 属性指定了 flex 元素的收缩规则。flex 元素仅在默认宽度之和大于容器的时候才会发生收缩,其收缩的大小是依据 flex-shrink 的值。
    • 在某些时候为了避免元素被压缩 可以设置 flex-shrink:0
  • 下图每个黑点是一个区块,用flex布局如何实现以下样式。
image.png
<div class="box">
  <div class="row">
    <span class="item"></span>
    <span class="item"></span>
    <span class="item"></span>
  </div>
  <div class="row">
    <span class="item"></span>
  </div>
  <div class="row">
     <span class="item"></span>
     <span class="item"></span>
  </div>
</div>
.box {
    display: flex;
    flex-wrap: wrap;
    width: 200px;
    height: 200px;
    background: #ccc;
    padding:10px;
    box-sizing: border-box;
}

.item{
    width: 30px;
    height: 30px;
    border-radius: 15px;
    background: black;
}

.row{
    flex-basis: 100%;
    display:flex;
    align-items: center;
    justify-content: space-between;
}

.row:nth-child(2){
    justify-content: center;
}

.row:nth-child(3){
    justify-content: space-between;
}


JavaScript 题目

  • 在很多网页中的js文件都调用window.onload 或者 window.addeventlistener('load', fn),这是为什么,DOMContentLoadedload有什么不同
    • 因为网页代码从上往下执行,确保JavaScript脚本在文档加载完成之后再执行,这样避免了加载未完成就执行脚本,而无法获取对象的情况。
    • HTML文档被加载和解析完成时,会触发DOMContentLoaded事件;页面上所有的资源(图片,音频,视频等)被加载以后才会触发load事件
  • call / apply / bind 这几个方法会用在什么地方有什么不同
    • 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部this的指向
    • call 与 apply在改变函数作用域的同时会执行函数, 而bing在改变作用域的时候则不会执行,而是返回一个新的函数
    • call 接受位置参数,apply接受数组
  • 如何清除一个数字数组中,重复的数字
    • 可以用Set数据结构清除掉重复掉数字
const arr = [1,2,3,4,5,1,2,3,4,7,8,9]
const arr2 = [...new Set(arr)]
  • 如何清除一个对象数组中,字面量重复的元素,(比例请求账单列表的时候,可能会出现两条完全一样的内容)
    • 和清除数字原理类似,将对象转成json,去重后再转回对象就可以了
const arr = [{a:1},{b:2},{c:3},{a:1},{d:4}]
const arr2= [... new Set(arr.map(item=>JSON.stringify(item)))].map(item=>JSON.parse(item))
  • XMLHttpRequest / Fetch / Axios 三种请求方式的异同
    • 都是网络请求的api, Axios 是第三方工具包,XMLHttpRequest / Fetch 是原生api
    • XMLHttpRequest 请求的时候可以监听进度条,而Fetch 不支持。
    • XMLHttpRequest 使用的是回调函数方式处理返回, Fetch返回promise
    • Fetch请求默认不带cookies
  • Promise / generataor 函数 / async/await 三者的联系
    • Promise 对象是一个代理对象(代理一个值),被代理的值在Promise对象创建时可能是未知的。它允许你为异步操作的成功和失败分别绑定相应的处理方法(handlers)。 这让异步方法可以像同步方法那样返回值,但并不是立即返回最终执行结果,而是一个能代表未来出现的结果的promise对象
    • 一个 Promise有以下几种状态: pending: 初始状态,既不是成功,也不是失败状态。fulfilled: 意味着操作成功完成。rejected: 意味着操作失败。
    • generataor 函数 可以在函数内部调用 yield 关键字调用promise ,避免了回调嵌套的产生,但是yield不用调用promise 的返回值。
    • async/await 是 generataor 函数的语法糖,用新的关键字 awati 替代了 yield,await可以接受promise 的返回值。并且async/await 返回的也是一个promise
  • 多个请求次序请求如何处理,例如请求服务器返回一组作者名称列表,再按每个作者名称查询他的文章,应该如何操作
    • 用async/await 语法可以避免回调嵌套。
const getData = async () => {
  const res1 = fetch('/author');
  const authorList = await res1.json();
  const res2 = await Promise.all(authorList.map(item=>fetch('/article?author='+item)))
  const articleList = await Promise.all(res2)
}
  • 多个请求并发处理如何处理,例如,已经拿到了作者名称列表时,需要同时查询每个作者的文章,应该如何操作
    • 把peding的promise放进一个数组,使用 Promise.all 方法调用,可以让所有请求同时发出,并等待一起返回。
const getData = async () => {
  const res1 = fetch('/author');
  const authorList = await res1.json();
  const res2 = await Promise.all(authorList.map(item=>fetch('/article?author='+item)))
  const articleList = await Promise.all(res2)
}

React 题目

  • react的常用的生命周期有哪些
    • 当一个 component 的 instance 被建立且加入 DOM 中时,其生命周期将会依照下列的顺序调用这些方法:
    constructor()
    static getDerivedStateFromProps()
    render()
    componentDidMount()
    
    • 当 prop 或 state 有变化时,就会产生更新。當一个 component 被重新 render 时,其生命周期将会依照下列的顺序调用这些方法:
    static getDerivedStateFromProps()
    shouldComponentUpdate()
    render()
    getSnapshotBeforeUpdate()
    componentDidUpdate()
    
    • 当一个 component 被从 DOM 中移除时,这个方法将会被调用:
     componentWillUnmount()
    
  • react的更新机制是怎么做的
    • 状态树(state, props)更新都会对比与上一颗状态树的异同,当发现节点状态不同后,会更新当前虚拟dom,如果更新当虚拟dom不同,则刷新真实当dom
  • PureComponent 有什么用
    • 只会浅层比较props 与state中的数据,避免某些额外的虚拟dom更新
  • 在用数组循环渲染的组件中,用索引(index)作为key会有问题吗
    • 在数组元素不发生重排的时候,不会有问题,如果数组重排,可能会引发一些不可控制的展示bug
  • 什么情况下需要需要用到redux(connect一个组件后,返回的是一个什么)
    • 在项目组件过多,传递props需要穿过多层组件的时候使用,方便统一数据管理
    • connect 默认返回的是一个PureComponent
  • redux的数据流程
    • action => store => reducer => store => 更新component
  • 过往的项目中是如何在redux发起异步请求的,比如在输入用户名密码后,显示个人中心,代码逻辑是怎么做的
    • 因为reducer处理数据是同步的,所有异步数据处理需要用redux-thunk / redux-saga中间键来处理异步
    • 可以在action处理完异步请求,直接向路由对象push一个新的地址
  • 如何理解函数式编程,map filter reduce 函数在项目中用的多吗
    • 函数是"第一等公民"
    • 只用"表达式",不用"语句"
    • 没有"副作用"
    • 不修改状态
    • 引用透明
    • map filter reduce 三个函数式编程代代表性的函数,应该会用的比较多

算法题目

  • 常见数据结构有哪些
    • 数组 链表 字典 栈 队列 树 图
  • 链表与数组在查询/插入元素的时候有什么不同
    • 链表插入删除速度快,但是查询速度慢
    • 数组插入热速慢,但是查询速度快
  • 时间复杂度是什么,冒泡算法的事件复杂度是多少,原因?
    • 算法的时间复杂度(Time complexity)是一个函数,它定性描述该算法的运行时间,时间复杂度常用大O符号表述。
    • On^2, 每一次循环遍历数组的时候,元素只会向前移动一个位置,所以如果要保证所有元素正确排序,比如最小的元素在原数组的最后,需要排到最前,需要循环套循环,才能保证排序正确。
  • 如何将以下数据转化成 两个 数组(服务器返回一组数据,需要将它转化为用于表格渲染的数据格式)
const obj = {
  '0': { key1: 1, key2: 2, key3: 3, key4: 4, key5: 5, },
  '1': { key1: 11, key2: 12, key3: 13, key4: 14, key5: 15, },
  '2': { key1: 21, key2: 22, key3: 23, key4: 24, key5: 25, },
  '3': { key1: 31, key2: 32, key3: 33, key4: 34, key5: 35, },
}

// 转化以下格式
[ 'key1', 'key2', 'key3', 'key4', 'key5' ]
[
  [ 1, 2, 3, 4, 5 ],
  [ 11, 12, 13, 14, 15 ],
  [ 21, 22, 23, 24, 25 ],
  [ 31, 32, 33, 34, 35 ]
]

// 解答
const header  = Object.keys(obj[Object.keys(obj)[0]])
const body = Object.values(obj).map(item=>Object.values(item))


项目规划题目 (高级工程师的问题)

  • 有没有做过从零搭建项目的经验
    • 如果没有做过,新建项目时候大概率会留坑
  • 如何划分功功能模块/路由页面的
    • 按业务流程先后循序分
    • 按照业务的差异性区分
    • 大的路由页面内部,如何划分小的功能模块
  • 过往中有没有遇到,因为项目前期设计不合理导致开发繁琐的事情,举例说明
    • 遗传下来的项目很可能有不合理的地方,能发现问题才能解决问题
  • 如何处理以往项目不合理设计部分
    • 直接在原有基础上封装?
    • 改写原有基础逻辑?
    • 一边更新一边重构 ?

90%以上,并且能回答高级工程问题的,可以定位高级工程师
80%-90%为中级工程师,90%以上但是不能回答高级工程师的问题的
60% - 80 % 初级工程师
60%以下,待定吧,这套题目不太复杂。

相关文章

网友评论

      本文标题:面试题目整理

      本文链接:https://www.haomeiwen.com/subject/hyaijktx.html