总结自己的前端面经

191 阅读6分钟

用友一面 半个小时

大致这么多问题,别的记不清了

  1. 自我介绍
  2. 怎么接触前端的 自学还是跟着导师
  3. 项目是自己做的还是跟着导师
  4. 常见的html标签
  5. 块级元素和行内元素的区别
  6. 实现水平垂直布局
  7. position定位详解
  8. position fixed和absolute的区别
  9. 有做过原生js的项目吗(没有,做过一些小demo轮播图。如何实现轮播图)
  10. js怎么获取DOM元素
  11. 获取到DOM元素,怎么改变img的src (两种)
  12. 两个变量怎么判断相等
  13. array的方法
  14. 有了解过跨域吗,如何解决
  15. 数组排序算法
  16. 原型链的概念
  17. 同步异步的概念 如何实现异步变同步
  18. 同步任务还是异步任务会阻塞代码
  19. 什么是回调函数 具体作用
  20. ese新特性有哪些
  21. let const var
  22. 有搭建自己的脚手架吗
  23. vue 组件通信的方法
  24. vuex 的方法(答了dispatch 和commit)
  25. vue路由的钩子函数 全局守卫
  26. vue路由的懒加载
  27. 封装axios 是为了实现什么功能
  28. 项目的登录模块怎么实现的 如何保持登录状态
  29. 封装什么组件 为了实现什么功能
  30. 后台是自己写的 还是用的mock数据

部分问题解答

    1. position属性 static absolute relative fixed sticky inheit
1. position: static(默认)
static属性为默认值,没有定位,元素出现在正常的流中(忽略 top, bottom, left, right 或者 z-index 声明).元素设置相对于原本位置的定位,元素并不脱离文档流,因此元素原本的位置会被保留,其他的元素位置不会受到影响

2.position:relative(相对定位)
此处的相对并不是相对于哪个父div或子div,相对只是相对于自身原本的位置发生变化。

3.position:absolute(绝对定位)
absolute定位是布局中最常用到的定位,其生成的位置是相对于带有position属性的父级来定位;
如果父级都没有position属性,则相对于document来定位最多也就到body;
使用absolute定位后,定位元素是脱离文档流的,这时候父级会检测不到定位元素的宽高。inline元素使用absolute定位之后,可以对其设置宽高;

4.position:fixed(固定定位)
也是脱离了文档流,与absolute一样,可以设置宽高,但是父级会检测不到定位元素的宽高,所以无法由子元素撑开。

5.inherit
继承父元素的position属性,但需要注意的是IE8已及往前的版本都不支持inherit属性

6.sticky (黏性定位,吸顶效果)
position属性中最有意思的就是sticky了,设置了sticky的元素,在屏幕范围(viewport)时该元素的位置并不受到定位影响(设置是top、left等属性无效),当该元素的位置将要移出偏移范围时,定位又会变成fixed,根据设置的left、top等属性成固定位置的效果
  • fixed和absolute的区别

      共同点:
    
     1.改变行内元素的呈现方式,display被置为block;
    
     2.让元素脱离普通流,不占据空间;
    
     3.默认会覆盖到非定位元素上
    
    
    
     不同点:
    
     absolute的”根元素“是可以设置的,而fixed的”根元素“固定为浏览器窗口。
    
     当你滚动网页,fixed元素与浏览器窗口之间的距离是不变的。
    
    1. 路由的懒加载
      整个网页默认是刚打开就去加载所有页面,路由懒加载就是只加载你当前点击的那个模块。
      按需去加载路由对应的资源,提高首屏加载速度(tip:首页不用设置懒加载,而且一个页面加载过后再次访问不会重复加载)。
      实现原理:将路由相关的组件,不再直接导入了,而是改写成异步组件的写法,只有当函数被调用的时候,才去加载对应的组件内容。
    1. 两种修改img src 的方法

      1. 直接获取dom元素修改src
      var obj = document.getElementById(“imgid”);\
      var obj.src ='realSrc' ;
      只能修改内置的属性
      
      2.getAttribute方法获取img的src属性 setAttribute去修改
      var obj = document.getElementById(“imgid”)\
      var imgSrc = obj.getAttribute(“src”);
      imgSrc.setAttribute('src',value)
      可以修改自定义的属性 没有则添加
      
    1. 判断两个变量相等

       1. `==` 以及 `===`
       2.  利用数组中的`toString`方法;
       3.`ES6`中的`Object.is`方法;
       4.利用`JSON.stringify`,转换为`String`类型来比较;
      ### `==` 及 `===`
      

==为转换类型比较运算符,===为严格比较运算符,在数据类型相同的情况下,使用==一般不会造成问题。

let num = 5;
let num2 = 5;

num == num2;//true
num === num2;//true
复制代码

但在数据类型不一致的情况下,==会做一些隐性的类型转换。

let num = 5;
let str = '5';

num == str;//true
num === str;//false

'' == false;//true
'' === false;//false

null == undefined;//true
null === undefined;//false
复制代码

隐性转换类型可以带来一些便利性,但也有可能造成不易发现的bug,所以还是更推荐使用===来进行比较,这也是TS之所以流行的原因之一。

此外,上面列举的都是基本数据类型的比较,而在用===比较引用类型时,会存在一定的局限性。

let a = {xx: 1};
let b = a;

a === b;//true

let c = {xx: 1};
let d = {xx: 1};

c === d;//false
复制代码


在比较引用类型时,`===`比较的是变量的引用是否相同,`而非值`,当引用不同时,就会返回`false`。

由此可见,`===`并不是一枚无往不利的银弹,在比较对象是否相等时,还需要借助其他更可靠的方法。

**Array toString方法**

前端给后端传参时,后端有时会要求多个参数`,`隔开,`Array toString`方法就比较有用了,这一方法也能用作数组比较。

let arr = [1,3,5,7,9]; let arr2 = [1,3,5,7,9];

arr.toString() === arr2.toString();//true "1,3,5,7,9"


不过也存在一定的局限性,不能用来比较二维及以上的数组、不能包含`null``undefined``object``function`等,否则容易出错,如下

[1,3,5,[2,4,6]].toString();//"1,3,5,2,4,6" [1,null,undefined,'',2].toString();//"1,,,,2" [{xx:2},window,1,2].toString();//"[object Object],[object Window],1,2" 复制代码


**Object.is方法**

`Object.is`是ES6中新增的方法,与`===`非常类似,同样用作比较两个值是否相等。

Object.is(1,1);//true Object.is('str','str');//true Object.is({},{});//false 复制代码


不同的是在判断`+0``-0``NaN``NaN`时的区别。

+0 === -0 //true NaN === NaN //false

Object.is(+0, -0) //false Object.is(NaN, NaN) //true



if (!Object.is) { Object.is = function(x, y) { if (x === y) { // 针对+0 不等于 -0的情况 return x !== 0 || 1 / x === 1 / y; } else { // 针对NaN的情况 return x !== x && y !== y; } }; }


**JSON.stringify**

`JSON.stringify`方法用于把对象或者数组转换为一个 JSON字符串,得出的字符串便可以用作对象的比较。

let obj = {name: 'lin', age: 24}; let obj2 = {name: 'lin', age: 24};

obj === obj2;//false JSON.stringify(obj) === JSON.stringify(obj2);//true 复制代码


`JSON.stringify`弥补了`===`无法准确比较对象的局限,不过它也有一定的局限性,在遇到`undefined``function`以及`symbol`值时会忽略。

另外,值得一提的是利用`JSON.parse``JSON.stringify`可实现对象深拷贝,局限性同上。