深圳地区近期面试100多道题汇总(含超详细答案),2024年最新前端高级面试framework

(当时是电话面,一个小时20分钟,问了我大概五六十道题,我能想到的一共是50题,还有一些记不起来了)

1. CommonJS和ES6模块的区别

  • CommonJS模块是运行时加载,ES6 Modules是编译时输出接口

  • CommonJS输出是值的拷贝;ES6 Modules输出的是值的引用,被输出模块的内部的改变会影响引用的改变

  • CommonJs导入的模块路径可以是一个表达式,因为它使用的是require()方法;而ES6 Modules只能是字符串

  • CommonJS this指向当前模块,ES6 Modules this指向undefined

  • 且ES6 Modules中没有这些顶层变量:argumentsrequiremoduleexports__filename__dirname

关于第一个差异,是因为CommonJS 加载的是一个对象(即module.exports属性),该对象只有在脚本运行完才会生成。而 ES6 模块不是对象,它的对外接口只是一种静态定义,在代码静态解析阶段就会生成。

(具体可以看我的这篇文章:https://juejin.im/post/5eaacd175188256d4345ea3a)

2. 模块的异步加载

模块的异步加载可以使用AMD或者CMD规范。

(具体可以看我的这篇文章:https://juejin.im/post/5eaacd175188256d4345ea3a)

3. 开发一个模块要考虑哪些问题?

封闭开放式原则、安全性

(应该还有,但是没想到)

4. 实现一个一组异步请求按顺序执行你有哪些方法?

  1. 利用reduce,初始值传入一个Promise.resolve(),之后往里面不停的叠加.then()。(类似于这里https://juejin.im/post/5e58c618e51d4526ed66b5cf#heading-51)

  2. 利用forEach,本质和reduce原理相同。(类似于这里https://juejin.im/post/5e58c618e51d4526ed66b5cf#heading-53)

  3. 还可以用ES9中的for...await...of来实现。

5. Promise.all()是并发的还是串行的?

并发的。不过Promise.all().then()结果中数组的顺序和Promise.all()接收到的数组顺序一致。

6. 平时写过哪些正则表达式

  • 之前有用过用正则去除输入框的首尾空格,正则表达式为:var trimReg = /(^\s+)|(\s+$)/g;不过后来由于Vue中有一个修饰符.trim,使用起来更方便(如v-model.trim="msg")就用这种方式多一些;再或者也可以用ES10新出的trimStarttrimEnd来去除首尾空格。

  • 用于校验手机号的正则:var phoneReg = /^1[3456789]\d{9}$/g

  • 用正则写一个根据name获取cookie中的值的方法:

function getCookie(name) {

var match = document.cookie.match(new RegExp(‘(^| )’ + name + ‘=([^;]*)’));

if (match) return unescape(match[2]);

}

详细介绍可以看这里:每日一题-JS篇-根据name获取cookie中值的方法:https://github.com/LinDaiDai/niubility-coding-js/blob/master/%E6%AF%8F%E6%97%A5%E4%B8%80%E9%A2%98/%E6%AF%8F%E6%97%A5%E4%B8%80%E9%A2%98-JS%E7%AF%87.md#%E7%94%A8%E6%AD%A3%E5%88%99%E5%86%99%E4%B8%80%E4%B8%AA%E6%A0%B9%E6%8D%AEname%E8%8E%B7%E5%8F%96cookie%E4%B8%AD%E7%9A%84%E5%80%BC%E7%9A%84%E6%96%B9%E6%B3%95

7. 正则里的非如何实现的

^要是放在[]里的话就表示"除了^后面的内容都能匹配",也就是非的意思。

例如:

(除了l,其它都变成了"帅")

var str = ‘lindaidai’;

console.log(str.replace(/[^l]/g, ‘帅’));

// l帅帅帅帅帅帅帅帅

反之,如果是不在[]里的话则表示开头匹配:

(只有l变成了"帅")

var str = ‘lindaidai’;

console.log(str.replace(/^l/g, ‘帅’));

8. webpack几种hash的实现原理

  • hash是跟整个项目的构建相关,只要项目里有文件更改,整个项目构建的hash值都会更改,并且全部文件都共用相同的hash值。(粒度整个项目)

  • chunkhash是根据不同的入口进行依赖文件解析,构建对应的chunk(模块),生成对应的hash值。只有被修改的chunk(模块)在重新构建之后才会生成新的hash值,不会影响其它的chunk。(粒度entry的每个入口文件)

  • contenthash是跟每个生成的文件有关,每个文件都有一个唯一的hash值。当要构建的文件内容发生改变时,就会生成新的hash值,且该文件的改变并不会影响和它同一个模块下的其它文件。(粒度每个文件的内容)

(具体可以看我简书上的这篇文章:https://www.jianshu.com/p/486453d81088)

这里只是说明了三种hash的不同…至于原理暂时没了解。

9. webpack如果使用了hash命名,那是每次都会重写生成hash吗

这个问题在上一个问题中已经说明了,要看webpack的配置。

有三种情况:

  • 如果是hash的话,是和整个项目有关的,有一处文件发生更改则所有文件的hash值都会发生改变且它们共用一个hash值;

  • 如果是chunkhash的话,只和entry的每个入口文件有关,也就是同一个chunk下的文件有所改动该chunk下的文件的hash值就会发生改变

  • 如果是contenthash的话,和每个生成的文件有关,只有当要构建的文件内容发生改变时才会给该文件生成新的hash值,并不会影响其它文件。

10. webpack中如何处理图片的?

webpack中有两种处理图片的loader

  • file-loader:解决CSS等中引入图片的路径问题;(解决通过url,import/require()等引入图片的问题)

  • url-loader:当图片小于设置的limit参数值时,url-loader将图片进行base64编码(当项目中有很多图片,通过url-loader进行base64编码后会减少http请求数量,提高性能),大于limit参数值,则使用file-loader拷贝图片并输出到编译目录中;

详细使用可以查看这里:霖呆呆的webpack之路-loader篇:https://github.com/LinDaiDai/niubility-coding-js/blob/master/%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E5%8C%96/webpack/%E9%9C%96%E5%91%86%E5%91%86%E7%9A%84webpack%E4%B9%8B%E8%B7%AF-loader%E7%AF%87.md#file-loader

11. 说一下回流和重绘

「回流」

触发条件:

当我们对 DOM 结构的修改引发 DOM 几何尺寸变化的时候,会发生回流的过程。

例如以下操作会触发回流:

  1. 一个 DOM 元素的几何属性变化,常见的几何属性有widthheightpaddingmarginlefttopborder 等等, 这个很好理解。

  2. 使 DOM 节点发生增减或者移动

  3. 读写 offset族、scroll族和client族属性的时候,浏览器为了获取这些值,需要进行回流操作。

  4. 调用 window.getComputedStyle 方法。

回流过程:由于DOM的结构发生了改变,所以需要从生成DOM这一步开始,重新经过样式计算生成布局树建立图层树、再到生成绘制列表以及之后的显示器显示这整一个渲染过程走一遍,开销是非常大的。

「重绘」

触发条件:

当 DOM 的修改导致了样式的变化,并且没有影响几何属性的时候,会导致重绘(repaint)。

重绘过程:由于没有导致 DOM 几何属性的变化,因此元素的位置信息不需要更新,所以当发生重绘的时候,会跳过生存布局树建立图层树的阶段,直接到生成绘制列表,然后继续进行分块、生成位图等后面一系列操作。

「如何避免触发回流和重绘」

  1. 避免频繁使用 style,而是采用修改class的方式。

  2. 将动画效果应用到position属性为absolutefixed的元素上。

  3. 也可以先为元素设置display: none,操作结束后再把它显示出来。因为在display属性为none的元素上进行的DOM操作不会引发回流和重绘

  4. 使用createDocumentFragment进行批量的 DOM 操作。

  5. 对于 resize、scroll 等进行防抖/节流处理。

  6. 避免频繁读取会引发回流/重绘的属性,如果确实需要多次使用,就用一个变量缓存起来。

  7. 利用 CSS3 的transformopacityfilter这些属性可以实现合成的效果,也就是CPU加速。

参考来源:https://juejin.im/post/5df5bcea6fb9a016091def69#heading-57

12. 盒模型及如何转换

box-sizing: content-box(W3C盒模型,又名标准盒模型):元素的宽高大小表现为内容的大小。

box-sizing: border-box(IE盒模型,又名怪异盒模型):元素的宽高表现为内容 + 内边距 + 边框的大小。背景会延伸到边框的外沿。

13. 实现水平垂直居中的几种方式

这里我是按照子弈的总结答的:https://juejin.im/post/5d690c726fb9a06b155dd40d#heading-81

  • Flex布局(子元素是块级元素)

.box {

display: flex;

width: 100px;

height: 100px;

background-color: pink;

}

.box-center{

margin: auto;

background-color: greenyellow;

}

  • Flex布局

.box {

display: flex;

width: 100px;

height: 100px;

background-color: pink;

justify-content: center;

align-items: center;

}

.box-center{

background-color: greenyellow;

}

  • 绝对定位实现(定位元素定宽定高)

.box {

position: relative;

height: 100px;

width: 100px;

background-color: pink;

}

.box-center{

position: absolute;

left: 0;

right: 0;

bottom: 0;

top: 0;

margin: auto;

width: 50px;

height: 50px;

background-color: greenyellow;

}

14. flex的兼容性怎样

「简单回答:」

IE6~9不支持,IE10~11部分支持flex的2012版,但是需要-ms-前缀。

其它的主流浏览器包括安卓和IOS基本上都支持了。

「详细回答:」

  • IE10部分支持2012,需要-ms-前缀

  • Android4.1/4.2-4.3部分支持2009 ,需要-webkit-前缀

  • Safari7/7.1/8部分支持2012, 需要-webkit-前缀

  • IOS Safari7.0-7.1/8.1-8.3部分支持2012,需要-webkit-前缀

15. 你知道到哪里查看兼容性吗

可以到Can I use上去查看,官网地址为:https://caniuse.com/

16. 移动端中css你是使用什么单位

「比较常用的」

  • em:定义字体大小时以父级的字体大小为基准;定义长度单位时以当前字体大小为基准。例父级font-size: 14px,则子级font-size: 1em;font-size: 14px;;若定义长度时,子级的字体大小如果为14px,则子级width: 2em;width: 24px

  • rem:以根元素的字体大小为基准。例如htmlfont-size: 14px,则子级1rem = 14px

  • %:以父级的宽度为基准。例父级width: 200px,则子级width: 50%;height:50%;width: 100px;height: 100px;

  • vw和vh:基于视口的宽度和高度(视口不包括浏览器的地址栏工具栏和状态栏)。例如视口宽度为1000px,则60vw = 600px;

  • vmin和vmaxvmin为当前vw 和vh中较小的一个值;vmax为较大的一个值。例如视口宽度375px,视口高度812px,则100vmin = 375px;100vmax = 812px;

「不常用的:」

  • ex和chex以字符"x"的高度为基准;例如1ex表示和字符"x"一样长。ch以数字"0"的宽度为基准;例如2ch表示和2个数字"0"一样长。

「移动端布局总结」

  1. 移动端布局的方式主要使用rem和flex,可以结合各自的优点,比如flex布局很灵活,但是字体的大小不好控制,我们可以使用rem和媒体查询控制字体的大小,媒体查询视口的大小,然后不同的上视口大小下设置设置html的font-size。

  2. 可单独制作移动端页面也可响应式pc端移动端共用一个页面。没有好坏,视情况而定,因势利导

(总结来源:玲珑)

17. rem和em的区别

「em:」

定义字体大小时以父级的字体大小为基准;定义长度单位时以当前字体大小为基准。例父级font-size: 14px,则子级font-size: 1em;font-size: 14px;;若定义长度时,子级的字体大小如果为14px,则子级width: 2em;width: 24px

「rem:」

以根元素的字体大小为基准。例如htmlfont-size: 14px,则子级1rem = 14px

18. 在移动端中怎样初始化根元素的字体大小

一个简易版的初始化根元素字体大小。

页面开头处引入下面这段代码,用于动态计算font-size

(假设你需要的1rem = 20px)

(function () {

var html = document.documentElement;

function onWindowResize() {

html.style.fontSize = html.getBoundingClientRect().width / 20 + ‘px’;

}

window.addEventListener(‘resize’, onWindowResize);

onWindowResize();

})();

  • document.documentElement:获取document的根元素

  • html.getBoundingClientRect().width:获取html的宽度(窗口的宽度)

  • 监听windowresize事件

一般还需要配合一个meta头:

19. 移动端中不同手机html默认的字体大小都是一样的吗

如果没有人为去改变根元素字体大小的话,默认是1rem = 16px;根元素默认的字体大小是16px

20. 你做过哪些动画效果

实话实说没太做过。

21. 如果让你实现一个一直旋转的动画你会如何做

css代码:

html代码:

22. animation介绍一下

语法:

animation: name duration timing-function delay iteration-count direction;

| 值 | 描述 |

| — | — |

| animation-name | 规定需要绑定到选择器的 keyframe 名称。(mymove) |

| animation-duration | 规定完成动画所花费的时间,以秒或毫秒计。(2s) |

| animation-timing-function | 规定动画的速度曲线。(ease|linear|ease-in|cubic-bezier(n,n,n,n)) |

| animation-delay | 规定在动画开始之前的延迟。(2s) |

| animation-iteration-count | 规定动画应该播放的次数。(n | infinite) n次/无限 |

| animation-direction | 规定是否应该轮流反向播放动画。(normal | alternate) 正常/反向 |

23. animation有一个steps()功能符知道吗?

一句话介绍:steps()功能符可以让动画不连续。

地位和作用:和贝塞尔曲线(cubic-bezier()修饰符)一样,都可以作为animation的第三个属性值。

和贝塞尔曲线的区别:贝塞尔曲线像是滑梯且有4个关键字(参数),而steps像是楼梯坡道且只有numberposition两个关键字。

语法:

steps(number, position)

  • number: 数值,表示把动画分成了多少段

  • position: 表示动画是从时间段的开头连续还是末尾连续。支持startend两个关键字,含义分别如下:

    • start:表示直接开始。
  • end:表示戛然而止。是默认值。

具体可以看这里:https://www.zhangxinxu.com/wordpress/2018/06/css3-animation-steps-step-start-end/

24. 用过哪些移动端的调试工具

  • Chrome浏览器 -> more tools -> Remote devices -> chrome://inspect/#devices

  • Mac + IOS + Safari

25. 说一下原型链

26. 详细说一下instanceof

27. V8的垃圾回收是发生在什么时候?

V8引擎帮助我们实现了自动的垃圾回收管理,「利用浏览器渲染页面的空闲时间进行垃圾回收。」

28. 具体说一下垃圾回收机制

(这里我用的是:https://juejin.im/post/5e8b261ae51d4546c0382ab4#heading-20 里的总结)

「栈内存的回收:」

栈内存调用栈上下文切换后就被回收,比较简单。

「堆内存的回收:」

V8的堆内存分为新生代内存和老生代内存,新生代内存是临时分配的内存,存在时间短,老生代内存存在时间长。

新生代内存回收机制:

  • 新生代内存容量小,64位系统下仅有32M。新生代内存分为**「From、To」**两部分,进行垃圾回收时,先扫描From,将非存活对象回收,将存活对象顺序复制到To中,之后调换From/To,等待下一次回收

老生代内存回收机制

  • 「晋升」:如果新生代的变量经过多次回收依然存在,那么就会被放入老生代内存中

  • 「标记清除」:老生代内存会先遍历所有对象并打上标记,然后对正在使用或被强引用的对象取消标记,回收被标记的对象

  • 「整理内存碎片」:把对象挪到内存的一端

(当然想要详细了解的话也可以看我的这篇文章:JavaScript进阶-内存机制(表情包初探)

29. 在项目中如何把http的请求换成https

由于我在项目中是会对axios做一层封装,所以每次请求的域名也是写在配置文件中,有一个baseURL字段专门用于存储它,所以只要改这个字段就可以达到替换所有请求httphttps了。

当然后面我也有了解到:

利用meta标签把http请求换为https:

30. 知道meta标签有把http换成https的功能吗?

参考上一题???。

31. http请求可以怎么拦截

在浏览器和服务器进行传输的时候,可以被nginx代理所拦截,也可以被网关拦截。

32. https的加密方式

HTTPS主要是采用对称密钥加密和非对称密钥加密组合而成的混合加密机制进行传输。

也就是发送密文的一方用"对方的公钥"进行加密处理"对称的密钥",然后对方在收到之后使用自己的私钥进行解密得到"对称的密钥",这在确保双发交换的密钥是安全的前提下使用对称密钥方式进行通信。

33. 混合加密的好处

对称密钥加密和非对称密钥加密都有它们各种的优缺点,而混合加密机制就是将两者结合利用它们各自的优点来进行加密传输。

比如既然对称密钥的优点是加解密效率快,那么在客户端与服务端确定了连接之后就可以用它来进行加密传输。不过前提是得解决双方都能安全的拿到这把对称密钥。这时候就可以利用非对称密钥加密来传输这把对称密钥,因为我们知道非对称密钥加密的优点就是能保证传输的内容是安全的。

所以它的好处是即保证了对称密钥能在双方之间安全的传输,又能使用对称加密方式进行通信,这比单纯的使用非对称加密通信快了很多。以此来解决了HTTP中内容可能被窃听的问题。

其它HTTP相关的问题:

如:

  • HTTPS的工作流程

  • 混合加密机制的好处

  • 数字签名

  • ECDHE握手和RSA握手

  • 向前安全性

这些问题都可以看到我的这篇文章:HTTPS面试问答:https://github.com/LinDaiDai/niubility-coding-js/blob/master/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/HTTPS%E9%9D%A2%E8%AF%95%E9%97%AE%E7%AD%94.md

34. 浏览器如何验证服务器的身份

这道题主要可以从数字签名数字证书上来答。

当时我答的时候就把证书的颁发流程HTTPS数字证书的验证过程完整的说了一遍就算过了。

具体可以看「HTTPS面试」???问答中的第5、6、7问。

35. ETag首部字段说一下

这个无非就是配合If-None-Match来达到一个协商缓存的作用。值为服务器某个资源的唯一标识。

具体可以看我的这篇文章:霖呆呆你来说说浏览器缓存吧

36. 你们的token一般是存放在哪里的

Token其实就是**「访问资源的凭证」**。

一般是用户通过用户名和密码登录成功之后,服务器将登陆凭证做数字签名,加密之后得到的字符串作为token

它在用户登录成功之后会返回给客户端,客户端主要有这么几种存储方式:

  1. 存储在localStorage中,每次调用接口的时候都把它当成一个字段传给后台

  2. 存储在cookie中,让它自动发送,不过缺点就是不能跨域

  3. 拿到之后存储在localStorage中,每次调用接口的时候放在HTTP请求头的Authorization字段里

(很明显我答的不够专业,欢迎补充,感谢???)

37. token会不会被伪造?

(很明显我答的不够专业,欢迎补充,感谢???)

38. redis中一般用来存什么

用户登录成功之后的一些信息

(很明显我答的不够专业,欢迎补充,感谢???)

39. 前后端如何验证一个用户是否下线了

(很明显我答的不够专业,欢迎补充,感谢???)

40. CSP白名单知道吗?

(很明显我答的不够专业,欢迎补充,感谢???)

41. nginx有配置过吗?

只会配置一些跨域方面的问题。

events {

worker_connections  1024;

}

http {

include       mime.types;

default_type  application/octet-stream;

sendfile        on;

keepalive_timeout  65;

server {

listen       80;

server_name  localhost;

location / {

proxy_pass  http://localhost:8887;

add_header  Access-Control-Allow-Origin *;

}

}

}

利用ngnix跨域的关键就是在配置文件中设置server项,然后设置其中的location属性,proxy_pass:需要代理的服务器地址,add_header:给响应报文中添加首部字段,例如Access-Control-Allow-Origin设置为*,即允许所有的请求源请求。

具体可以看:Yiming君-面试题:nginx有配置过吗?反向代理知道吗?

https://juejin.im/post/5eb0f8aaf265da7ba65f7ba2

42. 反向代理知道吗?

我们将请求发送到服务器,然后服务器对我们的请求进行转发,我们只需要和代理服务器进行通信就好。所以对于客户端来说,是感知不到服务器的。

43. 有用过抓包工具吗?

唔…没有…

44. 你平常用的电脑是Mac吗?

(…在电话那头默默的点头)

45. Fiddler有用过吗?

唔…知道…

46. Vue的diff算法

这里我是按照:

https://mp.weixin.qq.com/s/2xyP4jVevuXrGov_VsWfvA

中的第13题答的。

47. Vue中computed和methods的区别

48. 例如要获取当前时间你会放到computed还是methods里?

放在methods中,因为computed会有惰性,并不能知道new Date()的改变。

49. 你们的权限功能是怎么做的?

小小的写了一篇文章,可以看这里:数据权限如何控制

https://github.com/LinDaiDai/niubility-coding-js/blob/master/other/%E6%95%B0%E6%8D%AE%E6%9D%83%E9%99%90%E5%A6%82%E4%BD%95%E6%8E%A7%E5%88%B6.md

50. 那你在判断权限的时候是用的字符串匹配还是位运算?

和面试官扯了一堆我数据权限判断的具体过程,其中可能有多个权限:并的情况000011110001&000011110002,或的情况000011110001|000011110002,以及如何做的权限匹配。最后面试官:

"所以那还是用的字符串匹配咯?"

尬…我比较low…用的字符串匹配…

(哇,真的绝了…1个小时20分钟50多道题,答的我口渴???,不过也可以看出有很多移动端的我都没有答上来,面试官也表示理解,毕竟我主要是以PC端为主,所以竟然也算是过了,很感谢这位面试官细心的帮我分析一些问题)

后来有了解这位面试官近期也跳槽去腾讯了,果然面完呆呆之后他就去大厂了,好人一生平安???。

深圳某国内直播公司


这家公司其实是上家公司的总部,因为面完上家之后,HR也知道我的顾虑,想要去一个大点的团队,所以就把我推荐去了他们的总部。非常Nice的HR小姐姐,好感动,就算你看不到我的文章,我也还是要感谢你 ???。

5月8日

一面(前端副总监)

1. 输入URL到页面呈现

(必问…)

看三元的《(1.6w字)浏览器灵魂之问,请问你能接得住几个?》

https://juejin.im/post/5df5bcea6fb9a016091def69

分别从网络,解析,渲染来说

2. 为什么说script标签建议放在body下面?

JS代码在加载完之后是立即执行的,且JS代码执行时会阻塞页面的渲染。

3. 为什么说script标签会阻塞页面的渲染呢?渲染线程和js引擎线程不是分开的吗?

JS属于单线程,当我们在加载script标签内容的时候,渲染线程会被暂停,因为script标签里可能会操作DOM的,所以如果你加载script标签又同时渲染页面肯定就冲突了,因此说渲染线程(GUI)和js引擎线程互斥。

4. 协商缓存说一下

Last-Modefied配合If-Modified-Since

ETag配合If-None-Match

也是个常见的问题了,不了解的小伙伴可以看我的这篇文章:霖呆呆你来说说浏览器缓存吧

(当时面试官还重复了一下我说的这4个头部字段,自己回顾了一下我说的对不对,好可爱~)

5. HTTP中的Keep-Alive有了解过吗?

Keep-AliveHTTP的一个头部字段Connection中的一个值,它是保证我们的HTTP请求能建立一个持久连接。也就是说建立一次TCP连接即可进行多次请求和响应的交互。它的特点就是只要有一方没有明确的提出断开连接,则保持TCP连接状态,减少了TCP连接和断开造成的额外开销。

另外,在HTTP/1.1中所有的连接默认都是持久连接的,但是HTTP/1.0并未标准化。

6. 跨域有了解吗?如何解决跨域?

我工作中碰到主要是利用CORS来解决跨域问题,说了一下它的原理以及后台需要如何做。

另外说到了JSONP的原理,以及它的优点:兼容性好;缺点:只能进行GET请求,且有安全问题。

还有说到了ngnix反向代理来解决跨域。

  • CORS原理及实现:https://www.jianshu.com/p/b2bdf55e1bf5

  • JSONP原理及实现:https://www.jianshu.com/p/88bb82718517

  • 面试题:nginx有配置过吗?反向代理知道吗?:https://juejin.im/post/5eb0f8aaf265da7ba65f7ba2

其它的,我当时说我有看过一篇文章里面详细的介绍10多种跨域解决方案,但是自己没有过多的去了解。

哈哈,其实也就是秋风大大的这篇文章10种跨域解决方案(附终极大招)

7. WebSocket有了解过吗?它也可以跨域的

这个当时答的没用过。

我知道它是能使得客户端和服务器之间存在持久的连接,而且双方都可以随时开始发送数据,这种方式本质没有使用 HTTP 的响应头,因此也没有跨域的限制。

(多的不会了)

8. 前端安全方面?XSS?CSRF?

(必问…)

(以下回答参考子弈小哥哥的面试分享:两年工作经验成功面试阿里P6总结:https://juejin.im/post/5d690c726fb9a06b155dd40d#heading-60

以及蔡徐坤小哥哥的2万字 | 前端基础拾遗90问:https://juejin.im/post/5e8b261ae51d4546c0382ab4#heading-48

「XSS」

XSS(Cross Site Script)跨站脚本攻击。指的是攻击者向网页注入恶意的客户端代码,通过恶意的脚本对客户端网页进行篡改,从而在用户浏览网页时,对用户浏览器进行控制或者获取用户隐私数据的一种攻击方式。

主要是分为三种:

「存储型」:即攻击被存储在服务端,常见的是在评论区插入攻击脚本,如果脚本被储存到服务端,那么所有看见对应评论的用户都会受到攻击。

「反射型」:攻击者将脚本混在URL里,服务端接收到URL将恶意代码当做参数取出并拼接在HTML里返回,浏览器解析此HTML后即执行恶意代码

「DOM型」:将攻击脚本写在URL中,诱导用户点击该URL,如果URL被解析,那么攻击脚本就会被运行。和前两者的差别主要在于DOM型攻击不经过服务端

如何防御XSS攻击

  • 「输入检查」:对输入内容中的script<iframe>等标签进行转义或者过滤

  • 「设置httpOnly」:很多XSS攻击目标都是窃取用户cookie伪造身份认证,设置此属性可防止JS获取cookie

  • 「开启CSP」,即开启白名单,可阻止白名单以外的资源加载和运行

「CSRF」

CSRF攻击(Cross-site request forgery)跨站请求伪造。是一种劫持受信任用户向服务器发送非预期请求的攻击方式,通常情况下,它是攻击者借助受害者的 Cookie 骗取服务器的信任,但是它并不能拿到Cookie,也看不到Cookie的内容,它能做的就是给服务器发送请求,然后执行请求中所描述的命令,以此来改变服务器中的数据,也就是并不能窃取服务器中的数据。

防御主要有三种:

验证Token:浏览器请求服务器时,服务器返回一个token,每个请求都需要同时带上token和cookie才会被认为是合法请求

验证Referer:通过验证请求头的Referer来验证来源站点,但请求头很容易伪造

设置SameSite:设置cookie的SameSite,可以让cookie不随跨站请求发出,但浏览器兼容不一

「点击挟持」

  • 诱使用户点击看似无害的按钮(实则点击了透明 iframe 中的按钮).

  • 监听鼠标移动事件,让危险按钮始终在鼠标下方.

  • 使用 HTML5 拖拽技术执行敏感操作(例如 deploy key).

预防策略:

  1. 服务端添加 X-Frame-Options 响应头,这个 HTTP 响应头是为了防御用 iframe 嵌套的点击劫持攻击。这样浏览器就会阻止嵌入网页的渲染。

  2. JS 判断顶层视口的域名是不是和本页面的域名一致,不一致则不允许操作,top.location.hostname === self.location.hostname

  3. 敏感操作使用更复杂的步骤(验证码、输入项目名称以删除)。

(这个来源于LuckyWinty: http://www.imooc.com/article/295400)

9. setTimeout的执行原理(EventLoop)

(必问…)

(回答参考:https://juejin.im/post/5e621f5fe51d452700567c32)

setTimeout的运行机制:执行该语句时,是立即把当前定时器代码推入事件队列,当定时器在事件列表中满足设置的时间值时将传入的函数加入任务队列,之后的执行就交给任务队列负责。但是如果此时任务队列不为空,则需等待,所以执行定时器内代码的时间可能会大于设置的时间

说了一下它属于异步任务,然后说了一下还有哪些宏任务以及微任务,最后说了一下EventLoop的执行过程。

  • 一开始整个脚本作为一个宏任务执行

  • 执行过程中同步代码直接执行,宏任务进入宏任务队列,微任务进入微任务队列

  • 当前宏任务执行完出队,检查微任务列表,有则依次执行,直到全部执行完

  • 执行浏览器UI线程的渲染工作

  • 检查是否有Web Worker任务,有则执行

  • 执行完本轮的宏任务,回到2,依此循环,直到宏任务和微任务队列都为空

(具体可以看这里:https://juejin.im/post/5e58c618e51d4526ed66b5cf#heading-1)

10. requestAnimationFrame有了解过吗?

(啪啪啪,不长记性,其实之前面试有被问过,但是忘了再去了解了,这就吃亏了,没答上来)

requestAnimationFrame是浏览器用于定时循环操作的一个接口,类似于setTimeout,主要用途是按帧对网页进行重绘。对于JS动画,用requestAnimationFrame 会比 setInterval 效果更好。

具体可以看:https://juejin.im/post/5e621f5fe51d452700567c32

11. requestAnimationFrame和setTimeout的区别?

同上…

12. 平常工作中ES6+主要用到了哪些?

(下面看着很多,但我肯定不是全答哈,挑了几个来回答)

ES6

  1. Class

  2. 模块importexport

  3. 箭头函数

  4. 函数默认参数

  5. ...扩展运输符允许展开数组

  6. 解构

  7. 字符串模版

  8. Promise

  9. let const

  10. Proxy、Map、Set

  11. 对象属性同名能简写

ES7

  1. includes

  2. **求幂运算符

ES8

  1. async/await

  2. Object.values()和Object.entries()

  3. padStart()和padEnd()

  4. Object.getOwnPropertyDescriptors()

  5. 函数参数允许尾部,

ES9

  1. for...await...of

  2. ...展开符合允许展开对象收集剩余参数

  3. Promise.finally()

  4. 正则中的四个新功能

ES10

  1. flat()

  2. flatMap()

  3. fromEntries()

  4. trimStarttrimEnd

  5. matchAll

  6. BigInt

  7. try/catch中报错允许没有err异常参数

  8. Symbol.prototype.description

  9. Function.toString()调用时呈现原本源码的样子

还不了解的小伙伴可以看看浪里哥的这篇:盘点ES7、ES8、ES9、ES10新特性

https://juejin.im/post/5dda2b5e6fb9a07a83691766

13. 如何在前端实现一个图片压缩

实话实话没做过,但是后来面试官告诉我:可以使用canvas来实现。具体做法等我写篇文章哈。

(当时我还反问了一句面试官:那批量图片压缩要怎么做呢?把他惊的…然后他和我说挺复杂的…

16. 项目中有碰到什么难的问题吗?如何解决的?

例举了我最经典的bpmn.js,以此来引出我写了很多关于这方面的教材,以及建立了微信群,为国内的bpmn.js社区贡献了一份力量…怎么高大上怎么来…

当然也有提到我GitHub上的bpmn-chinese-document项目只有100多的Star,他说理解,毕竟这东西用的人不是很多。

17. 期望薪资多少?

喊了个挺高的数,老哥笑了笑,你这个工作年限我们可能给不到,然后扯了点别的。

18. 还有什么想要问我的吗?

  • 团队人员分布情况

  • 技术栈

  • 我进去主要是负责哪块内容

  • 年终奖/季度奖

  • 调薪的频率以及幅度

  • 加班多不多

(其实后面这些问题应该是等到HR面的时候问的,但是感觉和面试官挺聊的来的我就先打听了)

二面(CTO)

1. JSONP的实现原理

绝了…又来

2. XSS攻击以及如何预防?

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

下面是我在学习HTML和CSS的时候整理的一些笔记,有兴趣的可以看下:

HTML、CSS部分截图

进阶阶段

进阶阶段,开始攻 JS,对于刚接触 JS 的初学者,确实比学习 HTML 和 CSS 有难度,但是只要肯下功夫,这部分对于你来说,也不是什么大问题。

JS 内容涉及到的知识点较多,看到网上有很多人建议你从头到尾抱着那本《JavaScript高级程序设计》学,我是不建议的,毕竟刚接触 JS 谁能看得下去,当时我也不能,也没那样做。

我这部分的学习技巧是,增加次数,减少单次看的内容。就是说,第一遍学习 JS 走马观花的看,看个大概,去找视频以及网站学习,不建议直接看书。因为看书看不下去的时候很打击你学下去的信心。

然后通过一些网站的小例子,开始动手敲代码,一定要去实践、实践、实践,这一遍是为了更好的去熟悉 JS 的语法。别只顾着来回的看知识点,眼高手低可不是个好习惯,我在这吃过亏,你懂的。

1、JavaScript 和 ES6

在这个过程你会发现,有很多 JS 知识点你并不能更好的理解为什么这么设计,以及这样设计的好处是什么,这就逼着让你去学习这单个知识点的来龙去脉,去哪学?第一,书籍,我知道你不喜欢看,我最近通过刷大厂面试题整理了一份前端核心知识笔记,比较书籍更精简,一句废话都没有,这份笔记也让我通过跳槽从8k涨成20k。

JavaScript部分截图

2、前端框架

前端框架太多了,真的学不动了,别慌,其实对于前端的三大马车,Angular、React、Vue 只要把其中一种框架学明白,底层原理实现,其他两个学起来不会很吃力,这也取决于你以后就职的公司要求你会哪一个框架了,当然,会的越多越好,但是往往每个人的时间是有限的,对于自学的学生,或者即将面试找工作的人,当然要选择一门框架深挖原理。

以 Vue 为例,我整理了如下的面试题。

Vue部分截图

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-WaJi4eTC-1712783814813)]
[外链图片转存中…(img-nUhmpZJE-1712783814814)]
[外链图片转存中…(img-NYN3JnWD-1712783814814)]
[外链图片转存中…(img-7E143iXi-1712783814814)]
[外链图片转存中…(img-jUyU39BF-1712783814815)]
[外链图片转存中…(img-riR5A0JU-1712783814815)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-A78sCkbn-1712783814815)]

下面是我在学习HTML和CSS的时候整理的一些笔记,有兴趣的可以看下:

HTML、CSS部分截图

进阶阶段

进阶阶段,开始攻 JS,对于刚接触 JS 的初学者,确实比学习 HTML 和 CSS 有难度,但是只要肯下功夫,这部分对于你来说,也不是什么大问题。

JS 内容涉及到的知识点较多,看到网上有很多人建议你从头到尾抱着那本《JavaScript高级程序设计》学,我是不建议的,毕竟刚接触 JS 谁能看得下去,当时我也不能,也没那样做。

我这部分的学习技巧是,增加次数,减少单次看的内容。就是说,第一遍学习 JS 走马观花的看,看个大概,去找视频以及网站学习,不建议直接看书。因为看书看不下去的时候很打击你学下去的信心。

然后通过一些网站的小例子,开始动手敲代码,一定要去实践、实践、实践,这一遍是为了更好的去熟悉 JS 的语法。别只顾着来回的看知识点,眼高手低可不是个好习惯,我在这吃过亏,你懂的。

1、JavaScript 和 ES6

在这个过程你会发现,有很多 JS 知识点你并不能更好的理解为什么这么设计,以及这样设计的好处是什么,这就逼着让你去学习这单个知识点的来龙去脉,去哪学?第一,书籍,我知道你不喜欢看,我最近通过刷大厂面试题整理了一份前端核心知识笔记,比较书籍更精简,一句废话都没有,这份笔记也让我通过跳槽从8k涨成20k。

JavaScript部分截图

2、前端框架

前端框架太多了,真的学不动了,别慌,其实对于前端的三大马车,Angular、React、Vue 只要把其中一种框架学明白,底层原理实现,其他两个学起来不会很吃力,这也取决于你以后就职的公司要求你会哪一个框架了,当然,会的越多越好,但是往往每个人的时间是有限的,对于自学的学生,或者即将面试找工作的人,当然要选择一门框架深挖原理。

以 Vue 为例,我整理了如下的面试题。

Vue部分截图

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-PRUPbnWF-1712783814816)]

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android Framework面试题是关于Android操作系统框架的一些问题,主要涉及Android应用程序的开发、调试和优化等方面。常见的面试题包括: 1. 什么是Android Framework? Android Framework是Android操作系统的核心组件之一,它提供了一系列API和工具,用于开发、调试和优化Android应用程序。 2. Android Framework的组成部分有哪些? Android Framework由四个主要组成部分组成:应用程序框架、系统服务、库和运行时环境。 3. 什么是Android应用程序框架? Android应用程序框架是Android Framework的核心组成部分,它提供了一系列API和工具,用于开发Android应用程序。应用程序框架包括四个主要组件:活动、服务、广播接收器和内容提供者。 4. 什么是Android系统服务? Android系统服务是Android Framework的一个重要组成部分,它提供了一系列系统级别的服务,如通知服务、位置服务、传感器服务等。 5. 什么是Android库? Android库是Android Framework的一个重要组成部分,它提供了一系列常用的功能和工具,如图形界面库、网络库、数据库库等。 6. 什么是Android运行时环境? Android运行时环境是Android Framework的一个重要组成部分,它提供了一系列核心库和虚拟机,用于执行Android应用程序。 7. 什么是Android应用程序的生命周期? Android应用程序的生命周期指的是应用程序从启动到关闭的整个过程,包括应用程序的创建、启动、暂停、恢复和销毁等阶段。 8. 什么是Android应用程序的四大组件? Android应用程序的四大组件包括:活动、服务、广播接收器和内容提供者。活动用于展示用户界面,服务用于在后台执行任务,广播接收器用于接收系统广播,内容提供者用于管理应用程序的数据。 9. 什么是Android应用程序的UI线程? Android应用程序的UI线程是指用于更新用户界面的线程,它负责处理用户界面的事件和更新UI组件。 10. 什么是Android应用程序的异步任务? Android应用程序的异步任务是指用于在后台执行任务的线程,它负责处理耗时的操作,如网络请求、数据库操作等。 ### 回答2: Android Framework 是 Android 应用开发的核心部分,它是一组软件模块,为 Android 应用提供基本的服务和功能,包括视图系统、资源管理器、通知中心、系统 API 等等。以下是 Android Framework 面试题的回答: 1. 什么是 Android Framework?它有哪些组成部分? Android Framework 是 Android 应用开发的核心部分,它提供了一个标准化的架构,包括了一系列底层模块和服务,帮助开发者快速构建优质的应用程序。Android Framework 包括四个主要的组成部分: - Activity Manager:管理应用程序的生命周期、任务管理和应用程序调度。 - Content Provider:提供应用程序之间数据共享的机制。 - View System:提供视图组件的绘制和交互功能,包括 UI 组件、菜单、通知等。 - System API:提供开发者使用的系统级别 API,包括网络、存储、多媒体、传感器等各种功能。 2. 什么是 Intent? Intent 是在 Android 开发中用于启动组件、传递数据和执行操作的一种消息机制。Intent 由两个主要的部分组成,第一个是传递的动作行为(Action),用于指定所要执行的操作;第二个是传递的数据(Data),可包含要传递的信息、参数或操作。Intent 在 Android 应用中经常用于启动 Activity、Service、Broadcast Receiver,以及在应用程序之间传递数据。 3. 什么是 Content Provider? Content Provider 是 Android Framework 中的一项核心服务,用于提供跨应用程序数据共享的机制。Content Provider 可以通过 URI 的方式访问数据,并将一些特定的操作和查询暴露给外部应用程序。Content Provider 在 Android 应用中广泛应用于共享数据、存储和检索数据等功能。Content Provider 可以使用 SQLite 数据库存储数据,也可以使用其他数据源。 4. 什么是 Binder? Binder 是 Android Framework 中的一种进程间通信机制。它使用了一种名为跨进程通信 (IPC) 的技术,允许不同进程之间共享数据和资源,并可让应用程序在另一个进程执行功能。在 Android Framework 中,Activity 管理器、Service 和 Content Provider 等都是通过 Binder 与其他应用程序进行通信。Binder 还提供了一些高级功能,如安全性和线程管理。 5. 什么是 View System? View System 是 Android 应用程序中的 UI 组件,它提供了视图绑定、事件处理、资源管理和窗口布局等功能。在 Android Framework 中,View System 通过命名布局文件、使用 XML 描述视图和样式等机制,管理和绘制 UI 布局、界面组件和控件。View System 还提供了与其他系统服务的集成,如通知中心、扩展菜单、对话框等。 6. 什么是 Android Manifest? Android Manifest 是 Android 应用开发中必不可少的部分,它是应用程序清单文件,用于定义应用程序的基本信息和结构。Manifest 文件包含了应用程序使用的 Activity、Service、Broadcast Receiver 等组件,以及应用程序所需的权限和组件信息、应用程序元信息等。Manifest 文件还包括运行时动态创建的 Activity、Service 和 Receiver 的声明和权限标签,以及与应用程序的组件交互的 Intent 过滤器。 总结: Android Framework 是 Android 应用开发的核心,它提供了一组标准化的软件模块,为 Android 应用程序提供基本的服务和功能。通过对 Android Framework 的学习和理解,开发者可以更好地把握 Android 应用开发的核心技术,快速构建高质量的应用程序。 ### 回答3: Android framework在移动端操作系统中扮演了至关重要的角色,关系到整个Android系统的顺利运行和用户体验。以下是一些相关的面试题及其答案。 1. 什么是Android framework? Android framework主要指的是整个Android操作系统中的框架架构,包括组件、服务、库等等。它提供了一系列的API和开发者工具,使得应用程序设计者可以轻松地在上面开发、部署和调试应用程序。 2. Android framework中的四大组件是什么? Android framework中的四大组件包括Activity、Service、Content Provider和Broadcast Receiver。这些组件大都是基于事件驱动模型来设计的,通过系统的内部通信协议来实现各个组件之间的交互,以使得应用程序能够运行得更加高效、稳定和流畅。 3. Android framework中的应用程序包含哪些基本结构? Android framework中的应用程序包含了Activity、Manifest、布局文件、资源文件等等。其中,Activity是应用程序的基本单元,Manifest是整个应用程序的配置文件,而布局文件和资源文件则用于定义应用程序的用户界面和各种资源。 4. 什么是Android Intent? Android Intent是从一个组件(如Activity、Service、Broadcast Receiver等)向另一个组件传递消息的一种机制。Intent本身就是一个数据结构,其包含了一些元数据(如操作名称、数据URI、类别、组件名称、附加的Extras等),以及一些标志(如FLAG_ACTIVITY_NEW_TASK、FLAG_ACTIVITY_SINGLE_TOP等)等。通过使用Intent,不同组件之间可以实现相互通信和交互。 5. Android中的View和ViewGroup有何区别? 在Android中,View代表着一个基本的GUI控件,如Button、TextView等,而ViewGroup代表着一个包含了多个View的容器,如LinearLayout、RelativeLayout等。简单来说,View是最基本、最简单的GUI控件,而ViewGroup则是一个可以包含多个View的容器。通过使用View和ViewGroup,应用程序可以创建出丰富、多样化的用户界面。 总之,掌握了以上的面试题及其答案,相信大家对Android framework的基础知识已经有了较为全面的认识。当然,Android framework作为一个十分庞大和复杂的系统,还有许多其他的知识点和技术需要我们进一步了解和掌握。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值