前端面试题总结(五)插件篇

前端面试题总结(五)插件篇

一、什么是MVC?

  • MVC即model(数据层)、view(视图层)、controller(控制层)。

二、列举常用的js框架以及分别适用的领域

  1. jquery:简化了js的一些操作,并且提供了一些非常好用的API
  2. jquery ui、jquery-easyui:在jqeury的基础上提供了一些常用的组件 日期,下拉框,表格这些组件
  3. require.js、sea.js(阿里的玉帛)+》模块化开发使用的
  4. zepto:精简版的jquery,常用于手机web前端开发 提供了一些手机页面实用功能,touch
  5. ext.js:跟jquery差不多,但是不开源,也没有jquery轻量
  6. angular、knockoutjs、avalon(去哪儿前端总监):MV*框架,适合用于单页应用开发(SPA)

三、Angular和jQuery之间的区别?

  1. 从概念上来说,NG是一款前端框架,我们写的功能(代码)被NG调用;JQ是一个库,封装了很多功能,我们调用JQ里的API去实现一些功能
  2. 从应用上来看,NG需要考虑整个应用的架构,作为单页面的富客户端应用程序,JQ只是提供对DOM的包装和页面的渲染。
  3. 从使用上来看,NG几乎不存在DOM操作,不过NG中内置了一个JQlite,类似JQ,但也不推荐使用;JQ大量包装DOM,提高开发效率。

四、node.js适用场景?

  • 高并发、聊天、实时消息推送。

五、node的优缺点?

  • 优点:
    1. node是基于事件驱动的和无阻塞的,所以非常适合处理并发请求。
    2. 构建在node上的代理服务器相比其他技术实现(如ruby)的服务器表现要好的多。
    3. 与node代理服务器交互的客户端代码是由JavaScript语言编写的,所以客户端和服务器端都用同一种语言编写。
  • 缺点:
    1. node是一个相对新的开源项目,所以不太稳定,总是一直在变。
    2. 缺少足够多的第三方库支持。

六、模块化开发怎么做?

  • 立即执行函数,不暴露私有成员。

七、jQuery和jQuery UI有啥区别?

  1. jQuery是一个js库,主要提供的功能是选择器,属性修改和事件绑定等。
  2. jQuery UI是在jQuery的基础上,利用jQuery的扩展性,设计的插件,提供了一些常用的界面元素,如对话框、拖动行为、改变大小等。

八、jQuery中如何将数组转化为json字符串,然后再转化回来?

  • jQuery没有提供这个功能。可以先编写两个jQuery的扩展:
$.fn.stringifyArray = function(array){ return JSON.stringify(array) };
$.fn.parseArray = function(array){ return JSON.parse(array) };
//调用:
$("").stringify(array);
($.parseJSON("{'name':'john'}");JSON.stringify)。

九、针对jQuery的优化方法?

  1. 优先使用ID选择器。
  2. jQuery获取到的DOM元素如果需要多次使用,建议用一个变量保存起来,因为操作DOM的过程是非常耗性能的。
  3. 在class前使用tag(标签名)。
  4. 给选择器一个上下文。
  5. 尽量不要使用.live()方法。
  6. 使用data()方法存储临时变量。

十、如何判断当前脚本运行在浏览器还是node环境当中?

  • this === window ? "browser" : "node";
  • 通过判断global对象是否为window,如果不为window,当前脚本没有运行在浏览器当中。

十一、jQuery和zepto的区别?各自的使用场景?

  1. zepto最初是为移动端开发的库,是jQuery的轻量级替代品,因为其api和jQuery类似,而且文件更小。
  2. 大多数在jQuery中常用的api和方法zepto都有,zepto还有一些jQuery中没有的。
  3. 针对移动端程序,zepto有一些基本的触摸事件可以用来做触摸屏交互(tab事件、swipe事件),zepto是不支持IE浏览器的。
  4. zepto和jQuery不完全兼容。

十二、jQuery.fn的init方法返回的this指的是什么对象?为什么要返回this?

  • this执行init构造函数自身,其实就是jQuery实力对象,返回this是为了实现jQuery的链式操作。

十三、使用过angular吗?angular中的过滤器是干什么用的?

  • 在表达式中转换数据<p>姓名为{{lastName | uppercase}}</p>
  • currency,是什么过滤器?
  • 格式化数字为货币格式,单位是$符。

十四、ng-if和ng-show/hide的区别?

  1. ng-if在后面表达式为true的时候才创建这个dom节点,ng-show是初始时就创建了,用display控制显示和隐藏。
  2. ng-if会隐式的产生新作用域,ng-switch、ng-include等会动态创建一块界面的也是如此。

十五、ng-repeat迭代数组时,如果数组中有相同的值,会有什么问题,怎么解决?

  • 会提示Duplicates in a repeater are not allowed.加track by $index可解决。
  • 当然,也可以trace by任何一个普通的值,只要唯一性表示数组中的每一项即可(建立dom和数据之间的关联)。

十六、ng-click中写的表达式,能用js原生对象上的方法吗?

  • 不止是ng-click中的表达式,只要在页面中,都不能直接调用原生JS方法,因为这些并不存在于与页面对应的Controller的$scope中。
  • 如:{{parseInt(55.66)}}会什么也不显示,但是可以在$scope中添加$scope.parseInt = function(x){return parseInt(x)};

十七、{{now|'yyyy-MM-dd'}}这种表达式里,竖线和后面的参数通过什么方式可以自定义?

  • filter,格式化数据,接收一个输入,按某规则处理,返回处理结果。
  • 内置filter?
    • 内置filter有9种:data(日期)、currency(货币)、limitTo(限制数组或字符长度)、orderBy(排序)、lowercase(小写)、uppercase(大写)、number(格式化数字,加上千位分隔符,并接收参数限定小数点位数)、filter(处理一个数组,过滤出含有某个字符串的元素)、json(格式化json对象)。
  • filter的使用方法?
    • filter有两种使用方法:
      1. HTML中:{{obj | date : 'yyyy-MM-dd'}};
      2. js中:$filter('date')(obj,'yyyy-MM-dd hh:mm:ss');
    • $filter('过滤器名称')(需要过滤的对象, 参数1, 参数2,...)

十八、factory、service、provider是什么关系?

  • factory:把service的方法和数据放在一个对象里,并返回这个对象。
  • service:通过构造函数方式创建service,返回一个实例化对象。
  • provider:创建一个可通过config配置的service,$get中返回的,就是factory创建service的内容。
  • 从底层实现上来看,service调用了factory,返回其实例;factory调用了provider,返回其$get中定义的内容。factory和service功能类似,只不过factory是普通function,可以返回任何东西(return的都可以被访问);service是构造器,可以不返回(绑定的this的都可以被访问);provider是加强版的factory,返回一个可配置的factory。


十九、angular的数据绑定采用什么机制?

  • 脏检查机制。(通过$apply方法触发eval方法,当eval解析成功后,会触发$digest方法,然后由$digest方法触发$watch方法。)
  • 双向数据绑定时angularjs的核心机制之一。当view中有任何数据变化时,会跟新到model,当model中数据有变化时,view也会同步更新,而这个过程需要一个监控,原理就是,angular在scope模型上设置一个监听队列,用来监听数据变化更新view。每次绑定一个东西到view上时angular就会往$watch队列里插入一条$watch,用来检测它监视的model里是否有变化的东西。当浏览器接收到可以被angular context处理的事情,$digest循环就会触发,遍历所有的$watch,最后更新dom。
  1. 每个双向绑定的元素都有一个watcher。
  2. 在某些事件发生时,调用digest脏数据检测。(事件:表单元素内容变化、ajax请求响应、点击按钮执行的函数等)。
  3. 脏数据检测会检测下所有被watcher的元素。

二十、如何在平级界面模板间进行通信?

  1. 1、共用服务:在angular中,通过factory可以生成一个单例对象,在需要通信的模块中注入这个对象。
  2. 2、基于事件:有两种方式:
    1. 借助父controller。在子controller中向父controller触发($emit)一个事件,然后在父controller中监听($on)事件,在广播($broadcast)给子controller,这样通过事件携带的参数,实现了数据经过父controller,在统计controller之间的传播。
    2. 借助$rootScope。每个angular应用默认有一个根作用域$rootScope,根作用域位于最顶层,从它往下挂着各级作用域。所以,如果子控制器直接使用$rootScope广播和接收事件,那么就可实现同级之间的通信。

二十一、一个angular应用应当如何良好的分层?

  1. 目录结构的划分:
    1. 对于小型项目,可以按照文件类型组织。
    2. 对于规模比较大的项目,最好按照业务模块来划分。
    3. modules下最好再有一个common目录方公共的东西。
  2. 逻辑代码的拆分:
    1. 作为一个MVVM框架,angular应用本身就应该按照模型,视图模型(控制器),视图来划分。
    2. 主要指尽量让controller这一层很薄。
      1. 提取共用的逻辑到service中(如后台数据的请求,数据的共享和缓存,基于事件的模块间通信等)。
      2. 提取共用的界面操作到directive中(如将日期选择,分页等封装成组件等)。
      3. 提取共用的格式化操作到filter中等等。

二十二、angular应用常用哪些路由库,各自的区别是什么?

  • angular 1.x中常用ngRoute和ui.route,还有一种为angular2设计的new route(面向组件)。
  • 无论是ngRoute还是ui.route,作为框架额外的附加功能,都必须以模块依赖的形式被引入。
  • 区别:
    1. ngRoute模块是angular子代的路由模块,而ui.route模块是基于ngRoute模块开发的第三方模块。
    2. ui.route是基于state(状态)的,ngRoute是基于url的,ui.route模块具有更强大的功能,主要体现在视图的嵌套方面。
    3. 使用ui.route能定义有明确父子关系的路由,并通过ui-view指令将子路由模板插入到父路由模板的ui-view中区,从而实现视图嵌套。而在ngRoute中不能这样定义,如果同时在父子视图中使用了ng-view会陷入死循环。

二十三、分属不同团队进行开发的 angular 应用,如果要做整合,可能会遇到哪些问题,如何解决?

  • 可能会遇到不同模块之间的冲突。
  • 在angular 1.x中并没有很好的解决方法,所以最好在提前进行统一规划,做好约定,严格按照约定开发,每个开发人员只写特定区块代码。

二十四、angular的缺点有哪些?

  1. 强约束(导致学习成本高,对前端不友好。但遵守angularjs的约定时,生产力会很高,对Java程序员友好)。
  2. 不利于SEO(所有内容都是动态获取并渲染生成的,搜索引擎没法爬取。一种解决办法是,对于正常用户的访问,服务器响应 AngularJS 应用的内容;对于搜索引擎的访问,则响应专门针对 SEO 的HTML页面。)。
  3. 性能问题(作为 MVVM 框架,因为实现了数据的双向绑定,对于大数组、复杂对象会存在性能问题)。

二十五、angular的优化方法有哪些?

  1. 减少监控项(对不会变化的数据采取单向绑定)。
  2. 主动设置索引(指定track by,简单类型默认用自身索引,对象默认用$$hashKey,比如改为track by item.id)。
  3. 降低渲染数据量(如分页,或者每次取一小部分数据,根据需要再取)。
  4. 数据扁平化(比如对于树状结构,使用扁平化结构,构建一个map和树状数据,对树操作时,由于扁平数据统一引用,树状数据变更会同步到原始的扁平数据)。

二十六、如何看待angular 1.2中引入的controller as语法?

  • 在angular1.2以前,在view上的任何绑定都是直接绑定在$scope上的,使用controllerAs,不需要再注入$scope,controller变成了一个很简单的JavaScript对象(POJO),一个更纯粹的ViewModel。

二十七、讲解一下angular的“依赖注入”?

  • 依赖注入是一种软件设计模式,目的是处理代码之间的依赖关系,减少组件间的耦合。
  • angularjs是通过构造函数的参数名字来推断依赖服务名称的,通过toString()来找到这个定义的function对应的字符串,然后用正则解析出其中的参数(依赖项),再去依赖映射中取到对应的依赖,实例化后传入。(angular的依赖注入只是简单的获取它所需要的东西,而不需要创建哪些他们所依赖的东西。系统自动把a帮你注入到b里面去。)

二十八、简单介绍一下angular?

  • angularjs是一个前端的框架,跟后台的spring、Struts框架类似,可以帮助我们快速的搭建和开发前端项目。与jQuery等前端框架不同,angularjs不仅仅是一个工具,而是一个可以指导我们开发的框架。angular通过数据视图双向绑定、模块化、依赖注入等方式来帮助我们开发、管理前端项目。
  • angularjs是协助搭建单页面工程的开源前端框架。它通过MVC模式使得开发与测试变得更容易。
  • angularjs试图成为web应用中的一种端对端的解决方案。他将指导开发整个应用。
  • AngularJS于2009年发布第一个版本,由Google进行维护,压缩版94k。
  1. Angular 最大程度的减少了页面上的 DOM 操作, 解放了传统 JavaScript 中频繁的 DOM 操作;
  2. 让 JavaScript 中专注业务逻辑的代码;
  3. 通过简单的指令结合页面结构与逻辑数据;
  4. 通过自定义指令实现组件化编程;
  5. 代码结构更合理,维护成本更低;

二十九、AngularJs的核心原理是什么?

  • Angular通过双向绑定将视图与业务逻辑解耦。在AngularJS中通过数据视图双向绑定实现。提高了代码的可测试性。
  • 遵循MVC模式开发,鼓励视图、数据、逻辑组件间松耦合。

三十、什么是AngularJS中的指令概念?

  • 指令是AngularJS用来扩展浏览器能力的技术之一。在DOM编译期间,和HTML关联着的指令会被检测到,并且被执行。这使得指令可以为DOM指定行为,或者改变DOM的结构。
  • 指令可以用来创建自定义的标签。它们可以用来装饰元素或者操作DOM属性。

三十一、angular的特点?

  1. 双向数据绑定。
  2. MVVM模型,把视图和逻辑分开。
  3. 依赖注入。
  4. 减轻ajax请求。
  5. 模块化开发。

三十二、controller之间怎么通讯?

  1. event:
    • $scope.$emit,然后通过监听$rootScope的事件获取参数。
    • $rootScope.$broadcast:通过监听$scope的事件获取参数。
  2. service:创建一个专用的事件Service,也可以按照业务逻辑切分,将数据存储在相应的Service中。
  3. $rootScope:把数据存在$rootScope中,这样各个子#scope都可以调用。
  4. 直接使用$scope.$$nextSibling及类似的属性(官方不推荐任何$$开头的属性,既增加了耦合,又需要处理异步的问题,而且scope的顺序也不是固定的)。

三十三、angular中的$http?

  • $http是angular中的一个核心服务,用于读取远程服务器的数据。
  • 我们可以使用内置的$http服务直接同外部进行通信。$http服务只是简单的封装了浏览器原生的XMLHttpRequest对象。
  1. 链式调用:$http服务是只能接受一个参数的函数,这个参数是一个对象,包含用来生成http请求的配置内容。返回一个promise对象,具有success和error两个方法。
  2. 返回一个promise对象。
  3. 快捷的get请求。
  4. 响应对象。

三十四、单页应用有哪些优缺点?

  • 单页web应用,就是只有一张web页面的应用。
  • 单页应用程序(SPA)是加载单个HTML页面并在用户与程序交互时动态更新该页面的web应用程序。浏览器一开始会加载必须的HTML、css和JavaScript,所有的操作都在这张页面上完成,都由JavaScript来控制。
    1. 速度:更好的用户体验,让用户在web app感受native app的速度和流畅,
    2. MVC:经典MVC开发模式,前后端各负其责。
    3. ajax:重前端,业务逻辑全部在本地操作,数据都需要通过AJAX同步、提交。
    4. 路由:在URL中采用#号来作为当前视图的地址,改变#号后的参数,页面并不会重载。
  • 优点:
    1. 分离前后端关注点,前端负责界面显示,后端负责数据存储和计算,各司其职,不会把前后端的逻辑混杂在一起;
    2. 减轻服务器压力,服务器只用出数据就可以,不用管展示逻辑和页面合成,吞吐能力会提高几倍;
    3. 同一套后端程序代码,不用修改就可以用于Web界面、手机、平板等多种客户端;
  • 缺点:
    1. SEO问题,现在可以通过Prerender等技术解决一部分;
    2. 前进、后退、地址栏等,需要程序进行管理;
    3. 书签,需要程序来提供支持;

三十五、angularjs 是 mvc 还是 mvvm 框架?

  • 随着代码规模越来越大,切分职责是大势所趋,还有为了后期维护方便,修改一块功能不影响其他功能。还有为了复用,因为很多逻辑是一样的。而MVC只是手段,终极目标是模块化和复用。
  • mvvm的优点:
    1. 低耦合:View可以独立于Model变化和修改,同一个ViewModel可以被多个View复用;并且可以做到View和Model的变化互不影响
    2. 可重用性:可以把一些视图的逻辑放在ViewModel,让多个View复用
    3. 独立开发:开发人员可以专注与业务逻辑和数据的开发(ViewModemvvmdi计人员可以专注于UI(View)的设计
    4. 可测试性:清晰的View分层,使得针对表现层业务逻辑的测试更容易,更简单
  • 在angular中MVVM模式主要分为四部分:
    1. View:它专注于界面的显示和渲染,在angular中则是包含一堆声明式Directive的视图模板。
    2. ViewModel:它是View和Model的粘合体,负责View和Model的交互和协作,它负责给View提供显示的数据,以及提供了View中Command事件操作Model的途径;在angular中$scope对象充当了这个ViewModel的角色;
    3. Model:它是与应用程序的业务逻辑相关的数据的封装载体,它是业务领域的对象,Model并不关心会被如何显示或操作,所以模型也不会包含任何界面显示相关的逻辑。在web页面中,大部分Model都是来自Ajax的服务端返回数据或者是全局的配置对象;而angular中的service则是封装和处理这些与Model相关的业务逻辑的场所,这类的业务服务是可以被多个Controller或者其他service复用的领域服务。
    4. Controller:这并不是MVVM模式的核心元素,但它负责ViewModel对象的初始化,它将组合一个或者多个service来获取业务领域Model放在ViewModel对象上,使得应用界面在启动加载的时候达到一种可用的状态。
  • mvc的界面和逻辑关联紧密,数据直接从数据库读取。mvvm的界面与viewmode是松耦合,界面数据从viewmodel中获取。所以angularjs更倾向于mvvm。

本文章出自小小菜鸟学web,转载请注明

posted @ 2017-06-10 10:14  小小菜鸟学web  阅读(504)  评论(0编辑  收藏  举报