来,来,来!一起受虐啊~
总结一些很基础的面试题,如果你不会,那还是不要去面试了,要不太特么受虐了,怕你弱小的心灵接受不了现实。。。。哈哈,其实不要紧。
1、盒子模型
真是老掉牙的问题了。content+padding+border+margin ,平时我设置的width 其实是content 的宽度。box-sizing:boder-box;这样 width就是content+padding+border;
2、执行上下文,作用域,原型链
函数在执行之前都会做一些“准备工作”:1、变量的声明,而不是赋值!默认状态为undefined 2、this 赋值 3、函数声明赋值 这些准备工作我们称为“执行上下文环境”,函数每被调用一次,都会产生一个新的执行上下文环境。
var a=10;
function fn() {
console.log(a);
}
fn();
输出 10;
var a=10;
function fn() {
console.log(a);
var a=20;
}
fn();
输出 undefined;
每个函数在创建时都会产生自己的作用域,可以起到变量隔离的作用,不同作用域下的同名变量不会产生冲突。
作用域链:在fn函数创建的作用域中,变量a没有声明,那需要去创建fn的作用域中去找,还没有的话一直接着跨!一直跨到全局作用域为止。
原型链:每个函数都有一个原型prototype,每个对象都有一个__proto__,所谓的原型链就是:访问一个对象的属性时,__proto__属性中查找,如果没有,再沿着__proto__这条链向上找到prototype,这就是原型链。
3. ajax 请求返回的几种状态
1xx - 信息提示:100 - Continue 初始的请求已经接受,客户应当继续发送请求的其余部分。
2xx -成功 :200 - OK 一切正常,对GET和POST请求的应答文档跟在后面。
3xx -重定向: 304 - Not Modified 客户端有缓冲的文档并发出了一个条件性的请求,服务器告诉客户,原来缓冲的文档还可以继续使用。
4xx - 客户端错误:404 找不到页面。
5xx - 服务器错误: 500 - Internal Server Error 服务器遇到了意料不到的情况,不能完成客户的请求。
4. 用户输入url 后请求页面的过程:
- 浏览器查找域名的 IP 地址。这一步包括 DNS 具体的查找过程,包括:浏览器缓存 -> 系统缓存 -> 路由器缓存……
- 浏览器向 web 服务器发送一个 http 请求:三次握手、传送数据、四次挥手;
- 发送HTTP请求
- 服务器处理请求并返回HTTP报文
- 浏览器显示 html 页面:解析 html 以构建 DOM 树 –> 构建渲染树 –> 布局渲染树 –> 绘制渲染树;
- 浏览器发送请求,获取嵌入在 html 中的资源(如图片、音频、视频、CSS 、JS 等等);
- 浏览器发送异步请求。
5. 怎么获取ul 下li 的索引。
window.onload=function(){ var ul=document.getElementById('test'); var ul_lis=ul.getElementsByTagName('li'); for (var i = 0;i < ul_lis.length; i++) { ul_lis[i].index = i; ul_lis[i].onclick=function(){ var j=this.index+1; alert(j); } } };
或者jq 中的 $(this).index()+1;也可以。
6 、1,1,2,3,5,8,13....数组输入位置,求值,求和
//第n项对应的数值。 function com(n) { if (n <= 0) return 0; if (n == 1) return 1; return com(n - 1) + com(n - 2); } //前n项之和。 function sum(n) { if (n == 1) return 1; if (n < 1) return 0; return com(n) + sum(n -1); }
7、web前端如何进行优化?
(1、减少网络交互的次数(多次请求合并)
(2、减少网络传输数据量的大小(压缩)
(3、尽量减少编码(尽量提前将字符转化为字节,或者减少从字符到字节的转化过程。
(4、使用浏览器缓存
(5、减少Cookie传输
(6、合理布局页面
(7、使用页面压缩
(8、延迟加载页面
(9、CSS在最上面,JS在最下面
(10、CDN
(11、反向代理
(12、页面静态化
(13、异地部署
8、call 和apply 的区别。
call:a.call(b,arg1,arg2);将a 的方法应用到b上,其中b方法需要两个参数arg1和arg2。
call 可以改变this 的指向。a.call(b),那么this就指向b。可以理解为b继承了a 的属性和方法。
apply:它的第二个参数是个数组,将b方法需要的参数放在了一个数组中。
9、哪些操作会造成内存泄漏?
什么叫内存泄漏呢?内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。 垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收。 setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。 闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)。
10、事件循环:
http://www.ruanyifeng.com/blog/2014/10/event-loop.html 这里介绍的很好,自己可以研究一下。
11、怎么能么有闭包
闭包:读取函数内部变量,让这些变量始终存在内存中,应用情况无非两种,函数作为返回值,函数作为参数传递。
第一种:函数作为返回值:
function fn(){ var n=0; function inc (){ console.log(n++); } return inc; } var c=new fn(); c(); //1 c(); //2
第二种,作为参数传递:
var max=10; fn=function (x){ if(x>max){ console.log(x); } } (function (f) { var max=100; f(15); })(fn);
12、new操作符具体干了什么呢?其实很简单,就干了三件事情。
|
var obj = {}; obj.__proto__ = Base.prototype; Base.call(obj); |
13、flex
flex 是三个属性的缩写:flex-grow
属性定义项目的放大比例,默认为0
,即如果存在剩余空间,也不放大。都为1,则它们将等分剩余空间。
flex-shrink
属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。
flex-basis: number|auto|initial|inherit;
number | 一个长度单位或者一个百分比,规定灵活项目的初始长度。 |
auto | 默认值。长度等于灵活项目的长度。如果该项目未指定长度,则长度将根据内容决定。 |
initial | 设置该属性为它的默认值。请参阅 initial。 |
inherit | 从父元素继承该属性 |
14、常用的操作DOM
js:创建元素:CreateElement('p'); 创建文本内容:createTextNode("这是新段落。"); 追加内容或子元素:appendChild(); 从父元素中删除子元素:removeChild();
jq: parent() 返回直接父级; parents() 返回所有父级元素; parentsUntil() 返回父级直到 ; children() 后代元素; find('span') 发现所有后代为span元素. 还有好多,同胞元素:
- siblings()
- next()
- nextAll()
- nextUntil()
- prev()
- prevAll()
- prevUntil()
15、前端鉴权
使用基于 Token 的身份验证方法,大概的流程是这样的:
1. 客户端使用用户名跟密码请求登录
2. 服务端收到请求,去验证用户名与密码
3. 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
4. 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
5. 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
6. 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据