node.js面试题大全-侧重后端应用与对Node核心的理解

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

node.js面试题大全-侧重后端应用与对Node核心的理解Node是搞后端的,不应该被被归为前端,更不应该用前端的观点去理解,去面试node开发人员。所以这份面试题大全,更侧重后端应用与对Node核心的理解。github地址:注:这是本人历时一星期完成的小作品,github里面对一些关键代码还有js源文件.直接nodefilename.js就可查看效果.第一个版本,写的匆忙,能力有限,欢迎拍砖补充!后面持续更新会及时发布到github上.node开发技能图解起源node正风生火起,很多介绍却停留在入门阶段,无法投入生产node相关的高质量面试题更是少之又少,很难全面考查应聘者的node能力许多文章在讲第三方类库,可是这些库质量差距较大,一旦遇到问题怎么办必需的,全面了解node核心才能成为一名合格的node开发人员目标与原则前后端兼顾,更侧重后端理论实战兼顾,侧重考察对实战中应用较多的理论的理解参考答案简单明了,一针见血,不为追求严谨而浪费口舌,绕弯子尽量用代码讲清理论的应用与区别,以接地气终极目标是让大家对node有一个快速完整的认识内容大纲javascript高级话题(面向对象,作用域,闭包,设计模式等)node核心内置类库(事件,流,文件,网络等)node高级话题(异步,部署,性能调优,异常调试等)常用知名第三方类库(Async,Express等)其它相关后端常用技术(MongoDB,Redis,Apache,Nginx等)常用前端技术(Html5,CSS3,JQuery等)javascript高级话题(面向对象,作用域,闭包,设计模式等)1.常用js类定义的方法有哪些?参考答案:主要有构造函数原型和对象创建两种方法。原型法是通用老方法,对象创建是ES5推荐使用的方法.目前来看,原型法更普遍.代码演示1)构造函数方法定义类functionPerson(){this.name='michaelqin';}Person.prototype.sayName=function(){alert(this.name);}varperson=newPerson();person.sayName();2)对象创建方法定义类varPerson={name:'michaelqin',sayName:function(){alert(this.name);}};varperson=Object.create(Person);person.sayName();2.js类继承的方法有哪些参考答案:原型链法,属性复制法和构造器应用法.另外,由于每个对象可以是一个类,这些方法也可以用于对象类的继承.代码演示1)原型链法functionAnimal(){this.name='animal';}Animal.prototype.sayName={alert(this.name);};functionPerson(){}Person.prototype=Animal.prototype;//人继承自动物Person.prototype.constructor='Person';//更新构造函数为人2)属性自制法functionAnimal(){this.name='animal';}Animal.prototype.sayName={alert(this.name);};functionPerson(){}for(propinAnimal.prototype){Person.prototype[prop]=Animal.prototype[prop];}//复制动物的所有属性到人量边Person.prototype.constructor='Person';//更新构造函数为人3)构造器应用法functionAnimal(){this.name='animal';}Animal.prototype.sayName={alert(this.name);};functionPerson(){Animal.call(this);//apply,call,bind方法都可以.细微区别,后面会提到.}3.js类多重继承的实现方法是怎么样的?参考答案:就是类继承里边的属性复制法来实现.因为当所有父类的prototype属性被复制后,子类自然拥有类似行为和属性.4.js里的作用域是什么样子的?参考答案:大多数语言里边都是块作作用域,以{}进行限定,js里边不是.js里边叫函数作用域,就是一个变量在全函数里有效.比如有个变量p1在函数最后一行定义,第一行也有效,但是值是undefined.代码演示varglobalVar='globalvar';functiontest(){alert(globalVar);//undefined,因为globalVar在本函数内被重定义了,导致全局失效,这里使用函数内的变量值,可是此时还没定义varglobalVar='overridedvar';//globalVar在本函数内被重定义alert(globalVar);//overridedvar}alert(globalVar);//globalvar,使用全局变量5.js里边的this指的是什么?参考答案:this指的是对象本身,而不是构造函数.代码演示functionPerson(){}Person.prototype.sayName(){alert(this.name);}varperson1=newPerson();person1.name='michaelqin';person1.sayName();//michaelqin6.apply,call和bind有什么区别?参考答案:三者都可以把一个函数应用到其他对象上,注意不是自身对象.apply,call是直接执行函数调用,bind是绑定,执行需要再次调用.apply和call的区别是apply接受数组作为参数,而call是接受逗号分隔的无限多个参数列表,代码演示functionPerson(){}Person.prototype.sayName(){alert(this.name);}varobj={name:'michaelqin'};//注意这是一个普通对象,它不是Person的实例1)applyPerson.prototype.sayName.apply(obj,[param1,param2,param3]);2)callPerson.prototype.sayName.call(obj,param1,param2,param3);3)bindvarsn=Person.prototype.sayName.bind(obj);sn([param1,param2,param3]);//bind需要先绑定,再执行sn(param1,param2,param3);//bind需要先绑定,再执行7.caller,callee和arguments分别是什么?参考答案:caller,callee之间的关系就像是employer和employee之间的关系,就是调用与被调用的关系,二者返回的都是函数对象引用.arguments是函数的所有参数列表,它是一个类数组的变量.代码演示functionparent(param1,param2,param3){child(param1,param2,param3);}functionchild(){console.log(arguments);//{'0':'mqin1','1':'mqin2','2':'mqin3'}console.log(arguments.callee);//[Function:child]console.log(child.caller);//[Function:parent]}parent('mqin1','mqin2','mqin3');8.什么是闭包,闭包有哪些用处?参考答案:闭包这个术语,无论中文翻译还是英文解释都太2B了,我必须骂人,因为它什么其实都不是.非要讲它是什么的话,两个字函数,更多字嵌套函数的父子自我引用关系.所有函数都是闭包.通俗的说,闭包就是作用域范围,因为js是函数作用域,所以函数就是闭包.全局函数的作用域范围就是全局,所以无须讨论.更多的应用其实是在内嵌函数,这就会涉及到内嵌作用域,或者叫作用域链.说到内嵌,其实就是父子引用关系(父函数包含子函数,子函数因为函数作用域又引用父函数,这它妈不是死结吗?所以叫闭包),这就会带来另外一个问题,什么时候引用结束?如果不结束,就会一直占用内存,引起内存泄漏.好吧,不用的时候就引用设为空,死结就解开了.9.defineProperty,hasOwnProperty,isEnumerable都是做什么用的?参考答案:Object.defineProperty(obj,prop,descriptor)用来给对象定义属性,有value,writable,configurable,enumerable,set/get等.hasOwnProerty用于检查某一属性是不是存在于对象本身,继承来的父亲的属性不算.isEnumerable用来检测某一属性是否可遍历,也就是能不能用for..in循环来取到.10.js常用设计模式的实现思路,单例,工厂,代理,装饰,观察者模式等参考答案:1)单例:任意对象都是单例,无须特别处理varobj={name:'michaelqin',age:30};2)工厂:就是同样形式参数返回不同的实例functionPerson(){this.name='Person1';}functionAnimal(){this.name='Animal1';}functionFactory(){}Factory.prototype.getInstance=function(className){returneval('new'+className+'()');}varfactory=newFactory();varobj1=factory.getInstance('Person');varobj2=factory.getInstance('Animal');console.log(obj1.name);//Person1console.log(obj2.name);//Animal13)代理:就是新建个类调用老类的接口,包一下functionPerson(){}Person.prototype.sayName=function(){console.log('michaelqin');}Person.prototype.sayAge=function(){console.log(30);}functionPersonProxy(){this.person=newPerson();varthat=this;this.callMethod=function(functionName){console.log('beforeproxy:',functionName);that.person[functionName]();//代理console.log('afterproxy:',functionName);}}varpp=newPersonProxy();pp.callMethod('sayName');//代理调用Person的方法sayName()pp.callMethod('sayAge');//代理调用Person的方法sayAge()4)观察者:就是事件模式,比如按钮的onclick这样的应用.functionPublisher(){this.listeners=[];}Publisher.prototype={'addListener':function(listener){this.listeners.push(listener);},'removeListener'

1 / 39
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功