web前端面试经常遇得到的题型
1.position的值, relative和absolute分别是相对于谁进行定位的?
§ absolute :生成绝对定位的元素, 相对于最近一级的 定位不是 static 的父元素来进行定位。
§ fixed (老ie不支持)生成绝对定位的元素,通常相对于浏览器窗口或 frame 进行定位。
§ relative 生成相对定位的元素,相对于其在普通流中的位置进行定位。
§ static 默认值。没有定位,元素出现在正常的流中
§ sticky 生成粘性定位的元素,容器的位置根据正常文档流计算得出
2.如何解决跨域问题
jsonp:
原理是:动态插入script标签,通过script标签引入一个js文件,这个js文件载入成功后会执行我们在url参数中指定的函数,并且会把我们需要的json数据作为参数传入。
由于同源策略的限制,xmlhttprequest只允许请求当前源(域名、协议、端口)的资源,为了实现跨域请求,可以通过script标签实现跨域请求,然后在服务端输出json数据并执行回调函数,从而解决了跨域的数据请求。
优点是兼容性好,简单易用,支持浏览器与服务器双向通信。缺点是只支持get请求。
jsonp:json+padding(内填充),顾名思义,就是把json填充到一个盒子里
<script>
functioncreatejs(surl){
var oscript =document.createelement('script');
oscript.type = 'text/javascript';
oscript.src= surl;
document.getelementsbytagname('head')[0].appendchild(oscript);
}
createjs('jsonp.js');
box({
'name': 'test'
});
functionbox(json){
alert(json.name);
}
</script>
cors:
服务器端对于cors的支持,主要就是通过设置access-control-allow-origin来进行的。如果浏览器检测到相应的设置,就可以允许ajax进行跨域的访问。
通过修改document.domain来跨子域
将子域和主域的document.domain设为同一个主域.前提条件:这两个域名必须属于同一个基础域名!而且所用的协议,端口都要一致,否则无法利用document.domain进行跨域
主域相同的使用document.domain
使用window.name来进行跨域
window对象有个name属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的
使用html5中新引进的window.postmessage方法来跨域传送数据
还有flash、在服务器上设置代理页面等跨域方式。个人认为window.name的方法既不复杂,也能兼容到几乎所有浏览器,这真是极好的一种跨域方法。
3.谈谈你对webpack的看法
webpack 是一个模块打包工具,你可以使用webpack管理你的模块依赖,并编绎输出模块们所需的静态文件。它能够很好地管理、打包web开发中所用到的html、javascript、css以及各种静态文件(图片、字体等),让开发过程更加高效。对于不同类型的资源,webpack有对应的模块加载器。webpack模块打包器会分析模块间的依赖关系,最后 生成了优化且合并后的静态资源。
webpack的两大特色:
1.code splitting(可以自动完成)
2.loader 可以处理各种类型的静态文件,并且支持串联操作
webpack 是以commonjs的形式来书写脚本滴,但对 amd/cmd 的支持也很全面,方便旧项目进行代码迁移。
webpack具有requirejs和browserify的功能,但仍有很多自己的新特性:
1. 对 commonjs 、 amd、es6的语法做了兼容
2. 对js、css、图片等资源文件都支持打包
3. 串联式模块加载器以及插件机制,让其具有更好的灵活性和扩展性,例如提供对coffeescript、es6的支持
4. 有独立的配置文件webpack.config.js
5. 可以将代码切割成不同的chunk,实现按需加载,降低了初始化时间
4.xss与csrf有什么区别吗?
xss是获取信息,不需要提前知道其他用户页面的代码和数据包。csrf是代替用户完成指定的动作,需要知道其他用户页面的代码和数据包。
要完成一次csrf攻击,受害者必须依次完成两个步骤:
登录受信任网站a,并在本地生成cookie。
在不登出a的情况下,访问危险网站b。
csrf的防御
§ 服务端的csrf方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数。
§ 通过验证码的方法
. 支持 sourceurls 和sourcemaps,易于调试
. 具有强大的plugin接口,大多是内部插件,使用起来比较灵活
.webpack 使用异步 io 并具有多级缓存。这使得 webpack 很快且在增量编译上更加快
5.谈谈性能优化问题
代码层面:避免使用css表达式,避免使用高级选择器,通配选择器。
缓存利用:缓存ajax,使用cdn,使用外部js和css文件以便缓存,添加expires头,服务端配置etag,减少dns查找等
请求数量:合并样式和脚本,使用css图片精灵,初始首屏之外的图片资源按需加载,静态资源延迟加载。
请求带宽:压缩文件,开启gzip,
代码层面的优化
用hash-table来优化查找
少用全局变量
用innerhtml代替dom操作,减少dom操作次数,优化javascript性能
用settimeout来避免页面失去响应
缓存dom节点查找的结果
避免使用css expression
避免全局查询
避免使用with(with会创建自己的作用域,会增加作用域链长度)
多个变量声明合并
避免图片和iframe等的空src。空src会重新加载当前页面,影响速度和效率
尽量避免写在html标签中写style属性
移动端性能优化
尽量使用css3动画,开启硬件加速。
适当使用touch事件代替click事件。
避免使用css3渐变阴影效果。
可以用transform: translatez(0)来开启硬件加速。
不滥用float。float在渲染时计算量比较大,尽量减少使用
不滥用web字体。web字体需要下载,解析,重绘当前页面,尽量减少使用。
合理使用requestanimationframe动画代替settimeout
css中的属性(css3 transitions、css3 3d transforms、opacity、canvas、webgl、video)会触发gpu渲染,请合理使用。过渡使用会引发手机过耗电增加
pc端的在移动端同样适用
6.js继承方式及其优缺点
原型链继承的缺点
一是字面量重写原型会中断关系,使用引用类型的原型,并且子类型还无法给超类型传递参数。
借用构造函数(类式继承)
借用构造函数虽然解决了刚才两种问题,但没有原型,则复用无从谈起。所以我们需要原型链+借用构造函数的模式,这种模式称为组合继承
组合式继承
组合式继承是比较常用的一种继承方法,其背后的思路是 使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,又保证每个实例都有它自己的属性。
7.请你谈谈cookie的弊端
cookie虽然在持久保存客户端数据提供了方便,分担了服务器存储的负担,但还是有很多局限性的。
第一:每个特定的域名下最多生成20个cookie
1.ie6或更低版本最多20个cookie
2.ie7和之后的版本最后可以有50个cookie。
3.firefox最多50个cookie
4.chrome和safari没有做硬性限制
ie和opera 会清理近期最少使用的cookie,firefox会随机清理cookie。
cookie的最大大约为4096字节,为了兼容性,一般不能超过4095字节。
ie 提供了一种存储可以持久化用户数据,叫做userdata,从ie5.0就开始支持。每个数据最多128k,每个域名下最多1m。这个持久化数据放在缓存中,如果缓存没有清理,那么会一直存在。
优点:极高的扩展性和可用性
1.通过良好的编程,控制保存在cookie中的session对象的大小。
2.通过加密和安全传输技术(ssl),减少cookie被破解的可能性。
3.只在cookie中存放不敏感数据,即使被盗也不会有重大损失。
4.控制cookie的生命期,使之不会永远有效。偷盗者很可能拿到一个过期的cookie。
缺点:
1.`cookie`数量和长度的限制。每个domain最多只能有20条cookie,每个cookie长度不能超过4kb,否则会被截掉.
2.安全性问题。如果cookie被人拦截了,那人就可以取得所有的session信息。即使加密也与事无补,因为拦截者并不需要知道cookie的意义,他只要原样转发cookie就可以达到目的了。
3.有些状态不可能保存在客户端。例如,为了防止重复提交表单,我们需要在服务器端保存一个计数器。如果我们把这个计数器保存在客户端,那么它起不到任何作用。
浏览器本地存储
在较高版本的浏览器中,js提供了sessionstorage和globalstorage。在html5中提供了localstorage来取代globalstorage。
html5中的web storage包括了两种存储方式:sessionstorage和localstorage。
sessionstorage用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此sessionstorage不是一种持久化的本地存储,仅仅是会话级别的存储。
而localstorage用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。
8.web storage和cookie的区别
web storage的概念和cookie相似,区别是它是为了更大容量存储设计的。cookie的大小是受限的,并且每次你请求一个新的页面的时候cookie都会被发送过去,这样无形中浪费了带宽,另外cookie还需要指定作用域,不可以跨域调用。
除此之外,web storage拥有setitem,getitem,removeitem,clear等方法,不像cookie需要前端开发者自己封装setcookie,getcookie。
但是cookie也是不可以或缺的:cookie的作用是与服务器进行交互,作为http规范的一部分而存在 ,而web storage仅仅是为了在本地“存储”数据而生
浏览器的支持除了ie7及以下不支持外,其他标准浏览器都完全支持(ie及ff需在web服务器里运行),值得一提的是ie总是办好事,例如ie7、ie6中的userdata其实就是javascript本地存储的解决方案。通过简单的代码封装可以统一到所有的浏览器都支持web storage。
localstorage和sessionstorage都具有相同的操作方法,例如setitem、getitem和removeitem等
9.cookie 和session 的区别:
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗
考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用cookie。
4、单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie。
5、所以个人建议:
将登陆信息等重要信息存放为session
其他信息如果需要保留,可以放在cookie中
display:none和visibility:hidden的区别?
display:none 隐藏对应的元素,在文档布局中不再给它分配空间,它各边的元素会合拢,就当他从来不存在。
visibility:hidden 隐藏对应的元素,但是在文档布局中仍保留原来的空间。
10.css中link 和@import的区别是?
(1) link属于html标签,而@import是css提供的;
(2) 页面被加载的时,link会同时被加载,而@import被引用的css会等到引用它的css文件被加载完再加载;
(3) import只在ie5以上才能识别,而link是html标签,无兼容问题;
(4) link方式的样式的权重 高于@import的权重.
position:absolute和float属性的异同
§ 共同点:对内联元素设置float和absolute属性,可以让元素脱离文档流,并且可以设置其宽高。
§ 不同点:float仍会占据位置,absolute会覆盖文档流中的其他元素。
如果你现在正在纠结是否继续学前端,如果你害怕半途而废不知道从何开始,如果你觉得这篇文章对你还是有很大帮助的话,不介意的话可以加下我刚刚建立的一个学习交流群,有很多相关资料和学习视频:907694362