基于上次腾讯远程面试的题目总结与回答(精心总结回顾) 下
6. 简单说一说盒模型,W3C和IE怪异盒模型。
W3C标准的盒模型:width == content_width(不包括padding+border+margin)
IE怪异盒模型: width == content_width+padding+border
参考我之前的博客:http://blog.csdn.net/qq_20264891/article/details/79019724
7.简要阐述XSS和CSRF攻击及防范
7.1 XSS攻击与防范
注入攻击。
简而言之,XSS就是想方设法的在用户浏览的当前页面植入自己的script脚本,从而达到窃取用户信息,cookies等。
防范的方法:对一些常用表单的输入字符前端要进行转义、过滤、判断,后端则需要对请求进行甄别,分辨是否为正常请求。
例如:
<input type="text" value="<script>alert(123)</script>" name="input"></input>
显然,正常的用户,不会再输入框里面输入形如<script>alert(123)</script>
的字符串。那么前端在js层上,可以对获取到的表单值进行正则判断,或者转义,来甄别这个输入究竟是不是合法/正常的输入。
7.2 CSRF攻击与防范
CSRF就是在用户不知情的情况下,借助用户的信息,来发起伪造请求。
举例:用户访问A网站,登录以后并没有关闭网页或者清空缓存信息。此时被诱导点击B网站,B网站发起恶意请求,此时A网站服务端无法甄别该请求是否是用户的本意,因为用户在A网站已经登录,有cookies,所以相当于B网站借助用户,来在A网站为所欲为。
防范的主要措施在于后端,后端需要严格的来甄别该请求是否用户自己的本意,常见的方法措施有:验证请求头的Refer字段,加Token验证等。
参考文章:https://blog.tonyseek.com/post/introduce-to-xss-and-csrf/
这篇文章写的很好。
8.强类型语言有继承,在JS里面如何做到继承呢?(proto和prototype)
在JS中,继承主要是通过函数原型链来完成的。每个函数创建的时候都有一个_proto_
对象,构造函数则有一个prototype
对象,该对象上挂载的是可以继承的方法、属性等等。
8.1 构造函数内部有一个test()方法,prototype上也挂着一个test()方法,二者有何不同?
通过实例化对象来继承,只能继承prototype上的方法,而内部的test()方法无权访问。
9.页面性能优化有哪些方式?
a.文件(css,js,img)压缩、合并(雪碧图)
b.减少请求数量
c.减少页面重排/重绘
d.使用懒加载,按需加载
e.CSS3动画有限保持帧率
f.减少dom的访问次数,将经常的访问的节点/属性,进行定义并赋值
g.减少代码冗余量,精简代码
h.静态资源部署到CDN节点
9.1 重绘/重排是怎么回事?有什么区别?
网页加载的时候,会根据DOM节点构造出一颗DOM节点树,同时根据CSS树来渲染出CSS树,最后合并DOM树和CSS树 ,变成Render树,Render树将有所有的元素属性进行渲染、排布,包括使用相对单位的em/vh都通通转化成px,将隐藏的元素踢出树中等。
例如:当使用js动态添加div标签,那么整个dom树的构造就会发生变化,因此会引起浏览器的重排。
当某个DOM节点,甚至几个、几十个DOM节点的样式外观、属性发生变化,浏览器不得不把这些变化的属性重新进行渲染,在用户的浏览器view层得到体现,这就是重绘。
重排是对dom节点的排布,预先为每个dom节点留好坑,一旦有dom节点增删、位置变动、宽高增改的情况出现,就会进行重新排布。排布是发生在整个DOM树的,一旦DOM树改变,CSS渲染树的子节点/孙子节点也要重新变化,因而会重新绘制。
也就是说,重排一定会引发重绘。
重绘的过程,实际上是先有确定可见的DOM树,根据DOM树,构造出一颗节点/结构相同的CSS树,来对前者进行绘制。一旦DOM树结构变化,CSS树也要跟着变化,那么就会引起浏览器的重新绘制。如果DOM树没有发生结构变化,而仅仅是给其中的某个div加了1px height,然后把border:1px solid black,改成1px solid red,虽然没有进行重排,但是这过程进行了重绘。
也就是说,重绘现象的发生,有可能是以重排作为前提。
9.2 请举例说明重绘,什么情况下会重绘?
重排会引发重绘。样式属性(例如,颜色,字体大小,背景色)改变会引发重绘。
9.3 你认为样式是会引起重绘的吗?什么样式会引起重绘/重排?什么属性会引起重绘/重排?
是的。
color,background等属性会引发重绘。
浏览器窗口变化,DOM树结构变化(包括文本节点变化)引发重排。
10. 浏览器如何知道一个css文件,js文件需要缓存?
首先浏览器访问某个站点,会检查本地是否有缓存,如果有缓存,查看缓存是否新鲜,如果不新鲜,就去询问服务器,我这个缓存协议时间到了,可能不新鲜,你那边更新了吗?如果服务器缓存也没有更新,那么仍然使用本地缓存。这时服务器会返回304,意思是我这里也没更新,你就用以前的缓存吧。
在https://www.cnblogs.com/shixiaomiao1122/p/7591556.html看到一个缓存原理图,侵删,图注的很详细:
11.HTTP状态码304,502,503
304:缓存并未更新,让浏览器继续使用缓存好的静态文件,无需向服务器请求该静态资源。
502:服务器作为网关或代理,从上游服务器收到无效响应。
503:服务器停机维护。
http状态码:
1XX:临时响应。并继续等待客户端的请求
2XX:成功。201已创建,202已接受,203未授权信息,204无返回内容,205重置内容
3XX:重定向。300 多种选择,301 资源永久移动 ,302 资源临时移动,303 自动转到其他位置,304 未修改。
4XX:请求错误。401 未授权,404 未找到 ,403 禁止请求,406 不接受,408 超时。
5XX:服务器错误。500内部错误,501 尚未实施,502 错误网关,503 请求不可用。
12.Nodejs出现问题,怎么处理异常?已经上线的项目,如何处理异常?
任何项目只有未发现 bug 和已经发现 bug 两种情况
不存在没有 bug 的情况
即便是测试人员也不可能覆盖 100% 的可能性
但是测试表中的要求必须 100%
覆盖如果测试通过上线后产生的 bug
如果是测试表中未覆盖的则编制测试表的人员背锅
如果是不可抗力福利**背锅
作者:王小明
链接:https://www.zhihu.com/question/65688799/answer/233725228
开个玩笑,根据我自己发布响应式页面的时候,首先就是灰度发布,单位里有test服务器,可以直接部署到test上面,模拟上线环境,通过多个使用场景来监测应用是否健壮,例如:超大UV,高并发,加载时间等等,还要看页面中是否有静态资源出现路径错误,以及代码中写错/疏忽/遗漏的地方。
如果没有这个灰度发布的条件,项目上线出了问题,应该第一时间向leader反映,并寻求BUG处理的流程,如果项目访问量不大,可以在夜间偷偷填坑,如果访问量大,那么可以紧急追溯错误来源,并赶紧发布补丁/覆盖原有资源,避免造成不良影响的进一步扩大。如果BUG真的很逆天,那么可以考虑去填写离职手续。
上一篇: 关于 iPad 转屏的问题