前端面试集锦(2)

面试总结

1、自我介绍:姓名、学校、项目简述、自我评价

2、从输入URL到页面加载发生了什么

   https://www.cnblogs.com/daijinxue/p/6640153.html

  1、浏览器的地址栏输入URL并按下回车。

  2、浏览器查找当前URL是否存在缓存,并比较http缓存是否过期。

  3、DNS解析URL对应的IP。

  4、根据IP建立TCP连接(三次握手)。

  5、HTTP发起请求。

  6、服务器处理请求,浏览器接收HTTP响应。

  7、渲染页面,构建DOM树。

  8、关闭TCP连接(四次挥手)。

3、页面重绘和回流以及优化

  https://www.css88.com/archives/4996

       https://www.cnblogs.com/gyjWEB/p/4547140.html

  1. 当render tree中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建。这就称为回流(reflow)
  2. 每个页面至少需要一次回流,就是在页面第一次加载的时候。在回流的时候,浏览器会使渲染树中受到影响的部分失效,并重新构造这部分渲染树,完成回流后,浏览器会重新绘制受影响的部分到屏幕中,该过程成为重绘
  3. 当render tree中的一些元素需要更新属性,而这些属性只是影响元素的外观,风格,而不会影响布局的,比如background-color。则就叫称为重绘。
  4. 注意:回流必将引起重绘,而重绘不一定会引起回流。

优化:

  1. 将多次改变样式属性的操作合并成一次操作

  2. 将需要多次重排的元素,position属性设为absolute或fixed,这样此元素就脱离了文档流,它的变化不会影响到其他元素。例如有动画效果的元素就最好设置为绝对定位。

  3. 在内存中多次操作节点,完成后再添加到文档中去。例如要异步获取表格数据,渲染到页面。可以先取得数据后在内存中构建整个表格的html片段,再一次性添加到文档中去,而不是循环添加每一行。

  4. 由于display属性为none的元素不在渲染树中,对隐藏的元素操作不会引发其他元素的重排。如果要对一个元素进行复杂的操作时,可以先隐藏它,操作完成后再显示。这样只在隐藏和显示时触发2次重排。

  5. 在需要经常获取那些引起浏览器重排的属性值时,要缓存到变量。

4、IE9兼容性

5、css优化

6、elementUI优缺点

  Element UI 是一套采用 Vue 2.0 作为基础框架实现的组件库,它面向企业级的后台应用,能够帮助你快速地搭建网站,极大地减少研发的人力与时间成本

   (1)<el-input>无法完全兼容<input> 
    场景:<el-input>和vuejs结合起来时,无法实现输入框中的动态更新 
    解决方法:v-model要和<input/>搭配起来才能实现实时更新 

  (2)<el-button>对disabled属性的不支持 
    应用场景:有一个输入框,在框内没有内容时禁用旁边的删除按钮 
    方法:disabled属性

    所以只能使用<button>而不是<el-button>来使用disabled属性

7、修改elementUi默认样式 (-deep)

  https://blog.csdn.net/wangguoyu1996/article/details/81394707

  (1)在需要更改的组件里新增一个style标签【重点:不要加scoped】,然后直接获取class设置样式

  (2)/deep/;.resourceDig为我们要修改组件类名的父级组件样式类名。

    

8、Less和Sass使用过吗?Less优缺点?Less中@的使用

9、ES6数组去重:new set()

10、ES6扩展运算符(...)用法

11、排序算法(冒泡、快排实现代码)

12、怎么理解模块化

  https://blog.csdn.net/lxcao/article/details/52774825

  https://www.cnblogs.com/code-klaus/p/9011911.html

  https://blog.csdn.net/heyue_99/article/details/54894719

  立即执行函数: https://blog.csdn.net/csdn_yudong/article/details/77431106

   所谓模块化开发,就是封装细节,提供接口,彼此之间互不影响,每个模块都是实现某一特定功能。

  模块化开发的4点好处:

    1 避免变量污染,命名冲突

    2  提高代码复用率

    3 提高维护性

    4 依赖关系的管理

13、什么情况下使用组件,优点

14、vue父子组件之间怎么通信

15、vue全局组件使用、import的缺点

  https://blog.csdn.net/ywl570717586/article/details/79984909

  vue组件分两种: 全局组件和局部组件

  全局组件引入写法:在项目的main.js中

  局部组件引入写法:在需要使用组件的a.vue文件中

16、vue生命钩子

17、vue-router源码分析及路由实现原理

  https://blog.csdn.net/u013938465/article/details/79421239

  https://router.vuejs.org/zh/api/#router-resolve

  总结:

  1、安装插件
  混入beforeCreate生命周期处理,初始化_routerRoot,_router,_route等数据
  全局设置vue静态访问router和router和route,方便后期访问
  完成了router-link和 router-view 两个组件的注册,router-link用于触发路由的变化,router-view作 为功能组件,用于触发对应路由视图的变化

  2、根据路由配置生成router实例
  根据配置数组生成路由配置记录表
  生成监控路由变化的hsitory对象

  3、将router实例传入根vue实例
  根据beforeCreate混入,为根vue对象设置了劫持字段_route,用户触发router-view的变化
  调用init()函数,完成首次路由的渲染,首次渲染的调用路径是 调用history.transitionTo方法,根据router的match函数,生成一个新的route对象
  接着通过confirmTransition对比一下新生成的route和当前的route对象是否改变,改变的话触发updateRoute,更新hsitory.current属性,触发根组件的_route的变化,从而导致组件的调用render函数,更新router-view

  另外一种更新路由的方式是主动触发
  router-link绑定了click方法,触发history.push或者history.replace,从而触发history.transitionTo
  同时会监控hashchange和popstate来对路由变化作对用的处理

   

  

18、nodejs主要实现什么

===========================================================================================================================

1、vue生命周期

2、vue中修改了数据但视图无法更新的情况

  https://blog.csdn.net/qq_39985511/article/details/79778806

3、vue动态组件

  https://cn.vuejs.org/v2/api/#is

  通过 component 动态组件的方式遍历数据
  <component :is="item.type" :data="item" v-for="item in sourceData"></component>
  数据必须包含一个数据的所属组件类型

4、vue父子组件传播

5、vue监听路由

6、vue路由按需加载

7、v-if和v-show的区别

8、清除浮动的方法

  https://blog.csdn.net/u013137242/article/details/83753804

  (1)overflow:hidden;

<div style="overflow:hidden;zoom:1;">
    <p style="float: left;">使用overflow:hidden 清除浮动</p>
</div>

  (2)clear:both;

<style>
.clearfix:after{
    /*START 真正起到清除浮动的代码*/
    content: '';
    display: block;
    clear: both;
    /*END 真正起到清除浮动的代码*/
    height:0;
}
.clearfix{display: inline-block;} /* for IE/Mac */
</style>
<div class="clearfix">
    <div style="float: left;">clear:both ;son div</div>
</div>

  

9、display有几种

   http://www.w3school.com.cn/cssref/pr_class_display.asp

  none、inline、block、inline-block、table、inherit(继承父级的display属性)

10、inline-block和block的区别

  https://www.cnblogs.com/KeithWang/p/3139517.html

  https://blog.csdn.net/sinat_31311369/article/details/52425317

  • display:block
  1. block元素会独占一行,多个block元素会各自新起一行。默认情况下,block元素宽度自动填满其父元素宽度。
  2. block元素可以设置width,height属性。块级元素即使设置了宽度,仍然是独占一行。
  3. block元素可以设置margin和padding属性。
  • display:inline
  1. inline元素不会独占一行,多个相邻的行内元素会排列在同一行里,直到一行排列不下,才会新换一行,其宽度随元素的内容而变化。
  2. inline元素设置width,height属性无效。
  3. inline元素的margin和padding属性,水平方向的padding-left, padding-right, margin-left, margin-right都产生边距效果;但竖直方向的padding-top, padding-bottom, margin-top, margin-bottom不会产生边距效果。
  • display:inline-block
  1. 简单来说就是将对象呈现为inline对象,但是对象的内容作为block对象呈现。之后的内联对象会被排列在同一行内。比如我们可以给一个link(a元素)inline-block属性值,使其既具有block的宽度高度特性又具有inline的同行特性。

11、a标签是行内元素吗?可以设置宽、高、行高吗?

  a标签是内联元素,不可以设置宽、高,可以设置行高、padding水平方向、margin水平方向

12、css实现省略号?实现省略号的属性是?

  1、纯css+js控制省略号

<html>
<head>

<style type="text/css">
.box{width: 100px;height: 50px;overflow: hidden;}
.wz{float: left;height: 50px;margin-right: 20px;}
.dot{float: right;width: 20px;height:50px;margin-top: -50px;}
</style>

</head>

<body>
<div class="box">
  <div class="wz">文字内容</div>
  <div class="dot">...</div>
</div>

</body>
</html>

 2、https://blog.csdn.net/zpcqdkf/article/details/80486086

  300px;

  white-space:nowrap;

  overflow:hidden;

  text-overflow:ellipsis;

13、js删除数组最后一个元素、数组去重、数组转字符串

  数组去重: https://juejin.im/post/5aad40e4f265da237f1e12ed#heading-10

   pop()删除数组最后一个元素

  shift()删除数组第一个元素

  push()数组末尾添加元素一个或多个元素

  unshift()数组开头添加一个或多个元素

  reverse() 颠倒数组顺序

  splice() 数组删除/插入元素

  join() 数组转字符串

  cancat() 数组连接

  indexOf() 查找是否存在某个元素,返回下标(数组去重) 

  js中遍历数组并不会改变原始数组的方法总共有12个:

  ES5:
  forEach、every 、some、 fliter、map、reduce、reduceRight、
  ES6:
  find、findIndex、keys、values、entries

14、js事件委托

15、map和forEach区别

   https://blog.csdn.net/zgrkaka/article/details/79650804 

  共同点:

    1.都是循环遍历数组中的每一项。

    2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前项的索引index,原始数组input。

    3.匿名函数中的this都是指Window。

     4.只能遍历数组。

  不同点:

    1.forEach()没有返回值。

    2.map()有返回值,可以return 出来

16、promise的三个状态

   padding,fulfilled,rejected

  https://www.cnblogs.com/yunfeifei/p/4453690.html

17、localStorage和sessionStory区别

  https://blog.csdn.net/u013129606/article/details/81351163

  https://www.cnblogs.com/tylerdonet/p/4833681.html

18、字符串截取方法

   Substring

======================================================

19、深入理解js的prototype以及prototype的一些应用

原文地址:https://www.cnblogs.com/zhaomeizi/p/10250076.html