注明:上一篇献给前端求职路上的你们(上),主要侧重说的是前端面试中的html和css这两块常见问题,这是基础,其实在真正面试中,面试官往往采用的是由难到易的套路,那js和jQuery就是重中之重了,以及针对项目和所用技术方面的一些问题也就是你的必备储粮啦!
JavaScript
什么是闭包(closure),为什么要用它?
闭包简单的说就是一个函数能访问外部函数的变量,这就是闭包,不理解就看代码,例如:
function aa(x){
var num=1;
function bb(y){
console.log(x+y+(++num));
}
}
aa函数中的bb函数就是闭包了,bb函数可以使用aa函数的局部变量,参数,最典型的闭包应该是下面这样,将定义在函数中的函数作为返回值
function aa(x){
var num=1;
function bb(y){
console.log(x+y+(++num));
}
return bb;
}
闭包的另一种作用是隔离作用域,请看下面这段代码
for(var i=0;i<2;i++){
setTimeout(function(){
console.log(i);
},0);
}
上面这段代码的执行结果是2,2而不是0,1,因为等for循环出来后,执行setTimeout中的函数时,i的值已经变成了2.
谈谈This对象的理解
- this是js的一个关键字,随着函数使用场合不同,this的值会发生变化。
- 但是有一个总原则,那就是this指的是调用函数的那个对象。
- this一般情况下:是全局对象Global。 作为方法调用,那么this就是指这个对象
事件是?IE与火狐的事件机制有什么区别? 如何阻止冒泡?
- 我们在网页中的某个操作(有的操作对应多个事件)。例如:当我们点击一个按钮就会产生一个事件。是可以被 JavaScript 侦测到的行为。
- 事件处理机制:IE是事件冒泡、火狐是 事件捕获;
- ev.stopPropagation();
JavaScript的作用域和作用域链?
JavaScript的作用域指的是变量的作用范围,内部作用域由函数的形参,实参,局部变量,函数构成,内部作用域和外部的作用域一层层的链接起来形成作用域链,当在在函数内部要访问一个变量的时候,首先查找自己的内部作用域有没有这个变量,如果没有就到这个对象的原型对象中去查找,还是没有的话,就到该作用域所在的作用域中找,直到到window所在的作用域,每个函数在声明的时候就默认有一个外部作用域的存在了,代码如下:
var t=4;
function aa(){
var num1=12;
funciton bb(){
var num2=34;
console.log(t+" "+num1+" "+num2);
}
}
bb找t变量的过程就是,先到自己的内部作用域中找,发现没有找到,然后到bb所在的最近的外部变量中找,也就是aa的内部作用域,还是没有找到,再到window的作用域中找,结果找到了
“use strict”;是什么意思 ? 使用它的好处和坏处分别是什么?
ECMAscript 5添加了第二种运行模式:”严格模式”(strict mode)。顾名思义,这种模式使得Javascript在更严格的条件下运行。
设立”严格模式”的目的,主要有以下几个:
优点:
- 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
- 消除代码运行的一些不安全之处,保证代码运行的安全;
- 提高编译器效率,增加运行速度;
- 为未来新版本的Javascript做好铺垫。
注:经过测试 IE6,7,8,9 均不支持严格模式。
缺点:
现在网站的 JS 都会进行压缩,一些文件用了严格模式,而另一些没有。这时这些本来是严格模式的文件,被 merge 后,这个就合并到了文件的中间,不仅没有指示严格模式,反而在压缩后浪费了字节。
new操作符具体干了什么呢?
1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
2、属性和方法被加入到 this 引用的对象中。
3、新创建的对象由 this 所引用,并且最后隐式的返回 this 。
var obj = {};
obj.__proto__ = Base.prototype;
Base.call(obj);
Javascript中,有一个函数,执行时对象查找时,永远不会去查找原型,这个函数是?
hasOwnProperty()
你对JSON 的了解?
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。
它是基于JavaScript的一个子集。数据格式简单, 易于读写, 占用带宽小 {‘age’:’12’, ‘name’:’back’}
js延迟加载的方式有哪些?
defer和async、动态创建DOM方式(用得最多)、按需异步载入js
ajax 是什么?优缺点有哪些?
优点:
- 通过异步模式,提升了用户体验
- 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用
- Ajax在客户端运行,承担了一部分本来由服务器承担的工作,减少了大用户量下的服务器负载。
Ajax的最大的特点:
Ajax可以实现动态不刷新(局部刷新)
缺点:
1、ajax不支持浏览器back按钮。
2、安全问题 AJAX暴露了与服务器交互的细节。
3、对搜索引擎的支持比较弱。
4、破坏了程序的异常机制。
5、不容易调试。
如何解决跨域问题?
jsonp(利用script标签的跨域能力)跨域、websocket(HTML5的新特性,是一种新协议)跨域、设置代理服务器(由服务器替我们向不同源的服务器请求数据)、CORS(跨源资源共享,cross origin resource sharing)、iframe跨域、postMessage(包含iframe的页面向iframe传递消息)
模块化怎么做?立即执行函数,不暴露私有成员
var module1 = (function(){
var _count = 0;
var m1 = function(){
//...
};
var m2 = function(){
//...
};
return {
m1 : m1,
m2 : m2
};
})();
异步加载的方式有哪些?
(1) defer,只支持IE
(2) async: false,(默认是true);
(3) 创建script,插入到DOM中,加载完毕后callBack
documen.write和 innerHTML的区别
- document.write只能重绘整个页面
- innerHTML可以重绘页面的一部分
.call() 和 .apply() 的区别?
例子中用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4);
注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。
function add(a,b)
{
alert(a+b);
}
function sub(a,b)
{
alert(a-b);
}
add.call(sub,3,1);
Jquery与jQuery UI 有啥区别?
- *jQuery是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等。
- *jQuery UI则是在jQuery的基础上,利用jQuery的扩展性,设计的插件。
- 提供了一些常用的界面元素,诸如对话框、拖动行为、改变大小行为等等
jquery 中如何将数组转化为json字符串,然后再转化回来?
jQuery中没有提供这个功能,所以你需要先编写两个jQuery的扩展:
$.fn.stringifyArray = function(array) {
return JSON.stringify(array)
}
$.fn.parseArray = function(array) {
return JSON.parse(array)
}
然后调用:
$("").stringifyArray(array)
针对 jQuery 的优化方法?
- 基于Class的选择性的性能相对于Id选择器开销很大,因为需遍历所有DOM元素。
- 频繁操作的DOM,先缓存起来再操作。用Jquery的链式调用更好。
比如:var str=$("a").attr("href"); *for (var i = size; i < arr.length; i++) {}
for 循环每一次循环都查找了数组 (arr) 的.length 属性,在开始循环的时候设置一个变量来存储这个数字,可以让循环跑得更快:
for (var i = size, length = arr.length; i < length; i++) {}
JavaScript中的变量声明提升?
在函数用var声明的变量会在函数中函数体执行之前预先加载(变量回预先声明但是不会赋值)
请看代码,就会秒懂
var num=1;
function aa(){
console.log(num); //undeifned
var num=2;
console.log(num); //2
}
aa();
为什么在aa函数中会出现上述结果呢,这就是JavaScript的变量提升了,虽然变量num的定义在后面,不过浏览器在解析的时候,会把变量的定义放到最前面,上面的aa函数相当于
function aa(){
var num;
console.log(num); //undefined
num=2;
console.log(num); //2
}
那些操作会造成内存泄漏?
- 内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。
- 垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收。
- setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。
- 闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)
如何判断当前脚本运行在浏览器还是node环境中?(阿里)
通过判断Global对象是否为window,如果不为window,当前脚本没有运行在浏览器中
当然,在面试中,除了要知道这些基础的知识外,很多时候需要的是你的工作经验,你有没有?接下来就是在工作中,项目中,遇到的问题,解决方案,以及思考的一些套路啦
其他问题(举一些我碰见过的及汇总下来的问题,谨供大家参考)
- 你遇到过比较难的技术问题是?你是如何解决的?
- 常使用的库有哪些?常用的前端开发工具?开发过什么应用或组件?
- 页面重构怎么操作?
- 列举IE 与其他浏览器不一样的特性?
- 99%的网站都需要被重构是那本书上写的?
- 什么叫优雅降级和渐进增强?
- WEB应用从服务器主动推送Data到客户端有那些方式?
- 你在现在的团队处于什么样的角色,起到了什么明显的作用?
- 除了前端以外还了解什么其它技术么?你最最厉害的技能是什么?
- 如何设计突发大规模并发架构?
- 你认为怎样才是全端工程师(Full Stack developer)?
- 介绍一个你最得意的作品吧?
- 你的优点是什么?缺点是什么?
- 如何管理前端团队?
- 最近在学什么?能谈谈你未来3,5年给自己的规划吗?
对Node的优点和缺点提出了自己的看法?
优点
- 因为Node是基于事件驱动和无阻塞的,所以非常适合处理并发请求, 因此构建在Node上的代理服务器相比其他技术实现(如Ruby)的服务器表现要好得多。 此外,与Node代理服务器交互的客户端代码是由javascript语言编写的, 因此客户端和服务器端都用同一种语言编写,这是非常美妙的事情。
缺点
- Node是一个相对新的开源项目,所以不太稳定,它总是一直在变, 而且缺少足够多的第三方库支持。看起来,就像是Ruby/Rails当年的样子。
你有哪些性能优化的方法?(看雅虎14条性能优化原则)
(1) 减少http请求次数:CSS Sprites, JS、CSS源码压缩、图片大小控制合适;网页Gzip,CDN托管,data缓存 ,图片服务器。
(2) 前端模板 JS+数据,减少由于HTML标签导致的带宽浪费,前端用变量保存AJAX请求结果,每次操作本地变量,不用请求,减少请求次数
(3) 用innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能。
(4) 当需要设置的样式很多时设置className而不是直接操作style。
(5) 少用全局变量、缓存DOM节点查找的结果。减少IO读取操作。
(6) 避免使用CSS Expression(css表达式)又称Dynamic properties(动态属性)。
(7) 图片预加载,将样式表放在顶部,将脚本放在底部 加上时间戳。
(8) 避免在页面的主体布局中使用table,table要等其中的内容完全下载之后才会显示出来,显示比div+css布局慢。
http状态码有那些?分别代表是什么意思?
100-199 用于指定客户端应相应的某些动作。
200-299 用于表示请求成功。
300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。
400-499 用于指出客户端的错误。
400 1、语义有误,当前请求无法被服务器理解。
401 当前请求需要用户验证
403 服务器已经理解请求,但是拒绝执行它。
500-599 用于支持服务器错误。 503 – 服务不可用
一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?(流程说的越详细越好)
- 查找浏览器缓存
- DNS解析、查找该域名对应的IP地址、重定向(301)、发出第二个GET请求
- 进行HTTP协议会话
- 客户端发送报头(请求报头)
- 服务器回馈报头(响应报头)
- html文档开始下载
- 文档树建立,根据标记请求所需指定MIME类型的文件
- 文件显示
{浏览器这边做的工作大致分为以下几步:
加载:根据请求的URL进行域名解析,向服务器发起请求,接收文件(HTML、JS、CSS、图象等)。
解析:对加载到的资源(HTML、JS、CSS等)进行语法解析,建议相应的内部数据结构(比如HTML的DOM树,JS的(对象)属性表,CSS的样式规则等等)}
你常用的开发工具是什么,为什么?
可以从你接触前端到逐步深入学习使用的过程中,你用过什么编辑器以及转化的过程和原因方面回答
对前端界面工程师这个职位是怎么样理解的?它的前景会怎么样?
- 前端是最贴近用户的程序员,比后端、数据库、产品经理、运营、安全都近。
- 实现界面交互
- 提升用户体验
- 有了Node.js,前端可以实现服务端的一些事情
- 前端是最贴近用户的程序员,前端的能力就是能让产品从 90分进化到 100 分,甚至更好,
- 参与项目,快速高质量完成实现效果图,精确到1px;
- 与团队成员,UI设计,产品经理的沟通;
- 做好的页面结构,页面重构和用户体验;
- 处理hack,兼容、写出优美的代码格式;
- 针对服务器的优化、拥抱最新前端技术。
平时如何管理你的项目?
- 先期团队必须确定好全局样式(globe.css),编码模式(utf-8) 等;
- 编写习惯必须一致(例如都是采用继承式的写法,单样式都写成一行);
- 标注样式编写人,各模块都及时标注(标注关键样式调用的地方);
- 页面进行标注(例如 页面 模块 开始和结束);
- CSS跟HTML 分文件夹并行存放,命名都得统一(例如style.css);
- JS 分文件夹存放 命名以该JS功能为准的英文翻译。
- 图片采用整合的 images.png png8 格式文件使用 尽量整合在一起使用方便将来的管理
说说最近最流行的一些东西吧?常去哪些网站?
Node.js、MongoDB、npm、MVVM、MEAN、three.js 、angular、React、vue
github 、 知乎 、 MDN、 ES6、 Bootstrap 、 git
移动端(Android IOS)怎么做好用户体验?
- 清晰的视觉纵线、信息的分组、极致的减法、
- 利用选择代替输入、标签及文字的排布方式、
- 依靠明文确认密码、合理的键盘利用、
在面试中,其实是一个互动的环节,不仅要回答问题,也要抓住机会,获得主动权,想问公司的一些问题?
问公司问题:
- 目前关注哪些最新的Web前端技术(未来的发展方向)?
- 前端团队如何工作的(实现一个产品的流程)?
- 公司的薪资结构是什么样子的?(摸清自己具体在什么层次)
- 公司的晋升机制具体是怎么样的?(看出你的上进心的稳定性)
最后赠言
企业面试主要是看你能不能干的了。
企业很难招到一个适合的人,不会轻易把你淘汰掉。
如果对方挑你毛病,证明对方有招聘你的意图,否则的话,对方不会浪费时间挑你毛病,挑你毛病的主要原因是,想压榨你工资,所以你要自信一点,无论对方怎么挑你毛病都不要害怕。
企业中没有专门的面试官。
不是说我面试了这一家,他就一定要录取我,还有很多公司等着你去挑,目光放长远一点,一定要拿到自己满意的薪资才做。
面试就是一个解开双方谎言的过程,你能瞒过对方,证明你赢了。
换个心态去面试,不是企业在挑你,而是你在挑企业。昂起你自信的头颅,勇敢的去迎接挑战吧!你的未来属于你!
~END~