不同的注入方式有不同的应用场景吗?什么情况下用什么注入?

大家好,这是一篇超长面经+总结,是对自己上一阶段的梳理,也希望给今年金三银四准备找工作/正在找工作的同学们多多少少一点帮助。

基本介绍:普通985本+海外渣硕,大二转到CS专业,大三项目交流3+2,19年10月留学毕业,有工程项目,无实习无额外加分项,主Java研发岗,非battmd级别选手,加一起拿了4个offer,最后准备去星环了。

一,面经集合(按公司划分)

最早是去年的12月开始,中间有几个月在研究室抗压没有面,考虑到读者的阅读喜好所以按公司划分面经,强调一点是时间线很重要,前后自己面试能力也有差距,请留意。一般都是远程视频/电话面,每场面经内问题提问顺序不定。一些过于水的面经没有包括在内(比如8月前的某为,银行)

字节跳动一面,一经查实,将立刻删除涉嫌侵权内容。

}

2.前端控制器申请处理器映射器:查问可能解决该申请的Controller
3.将找到的Controller门路返回给前端控制器.

4.前端控制器申请处理器适配器: 找到可能解决该申请的处理器。
6.将解决后的后果和响应页面封装到ModelAndView对象中,返回给处理器适配器.

8.前端控制器申请视图解析器: 解析View对象,确定是哪个页面。
9.视图解析器外部拼接,将页面名称拼接成实在的页面门路,返回给前端控制器。(拼接前缀和后缀:View=hello –>(/WEB-INF/hello.jsp))
10.视图渲染(将数据填充到页面中(request域中)),最初将残缺的view展现给用户。

    作用:接管申请、响应后果,相当于转发器,有了DispatcherServlet 就缩小了其它组件之间的耦合度。
  • 处理器映射器HandlerMapping(不须要程序员开发)
    作用:依据申请的URL来查找Handler
  • 处理器Handler(须要程序员开发)
  • 视图解析器 ViewResolver(不须要程序员开发)
    作用:进行视图的解析,依据视图逻辑名解析成真正的视图(view)
  • 视图View(须要程序员开发jsp)
    View是一个接口, 它的实现类反对不同的视图类型(jsp,freemarker,pdf等等)
  • springmvc是基于办法开发(一个url对应一个办法),申请参数传递到办法的形参,能够设计为单例或多例(倡议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
  • Struts采纳值栈存储申请和响应的数据,通过OGNL存取数据,springmvc通过参数解析器是将request申请内容解析,并给办法形参赋值,将数据和视图封装成ModelAndView对象,最初又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认应用jstl。

4. 如何解决POST申请中文乱码问题,GET的又如何解决呢

  • get申请中文参数呈现乱码解决办法有两个:
  • ①批改tomcat配置文件增加编码与工程编码统一,如下:
  • ②另外一种办法对参数进行从新编码:
  • @RequestMapping:用于解决申请 url 映射的注解,可用于类或办法上。用于类上,则示意类中的所有响应申请的办法都是以该地址作为父门路。

6.SpringMvc的Controller是不是单例模式,如果是,有什么问题,怎么解决?

答:是单例模式,所以在多线程拜访的时候有线程平安问题,会影响性能的。解决方案是尽量不要在Controller中应用类变量。

对于多例状况一般属性是不会共用的,对于动态属性会去共用这个属性。
对于单例状况一般属性和动态属性都会被共用。(controller默认为单例)
springmvc是基于办法开发的,办法里边的形参不会被共享,因而默认是多例。springmvc如果要应用类变量,须要定义为多例的。Struts是基于类的属性开发的,单例会共享属性,因而单例不平安,所以默认为多例。

  1. MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计榜样。它是用一种业务逻辑、数据与界面显示拆散的办法来组织代码,将泛滥的业务逻辑汇集到一个部件外面,在须要改良和个性化定制界面及用户交互的同时,不须要从新编写业务逻辑,达到缩小编码的工夫。
  2. V即View视图是指用户看到并与之交互的界面。比方由html元素组成的网页界面,或者软件的客户端界面。MVC的益处之一在于它能为利用程序处理很多不同的视图。在视图中其实没有真正的解决产生,它只是作为一种输入数据并容许用户操纵的形式。
  3. M即model模型是指模型表示业务规定。在MVC的三个部件中,模型领有最多的解决工作。被模型返回的数据是中立的,模型与数据格式无关,这样一个模型能为多个视图提供数据,因为利用于模型的代码只需写一次就能够被多个视图重用,所以缩小了代码的重复性。
  4. C即controller控制器是指控制器承受用户的输出并调用模型和视图去实现用户的需要,控制器自身不输入任何货色和做任何解决。它只是接管申请并决定调用哪个模型构件去解决申请,而后再确定用哪个视图来显示返回的数据。
  1. SpringMVC自身是与Spring框架联合而成的,它同时领有Spring的长处(例如依赖注入DI和切面编程AOP等)。
  2. SpringMVc提供弱小的约定大于配置的契约式编程反对,即提供一种软件设计范式,缩小软件开发人员做决定的次数,开发人员仅需规定利用中不合乎约定的局部。
  3. 反对灵便的URL到页面控制器的映射。
  4. 能够不便地与其余视图技术(JSP、FreeMarker等)进行整合。因为SpringMVC的模型数据往往是搁置在Map数据结构中的,因而其能够很不便地被其余框架援用。
  5. 领有非常简洁的异样解决机制。
  6. 能够非常灵便地实现数据验证、格式化和数据绑定机制,能够应用任意对象进行数据绑定操作。

9. 当一个办法向AJAX返回非凡对象,譬如Object,List等,须要做什么解决?

  1. 在办法上加@ResponseBody注解,示意该办法的返回值不论是什么类型,都会返回JSON格局的数据。

10.SpringMVC用什么对象从后盾向前台传递数据的?

//2.放在model里,个别是应用这个
  1. 默认状况下Spring MVC将模型中的数据存储到request域中。当一个申请完结后,数据就生效了。如果要跨页面应用。那么须要应用到session。而@SessionAttributes注解就能够使得模型中的数据存储一份到session域中。
  1. names:这是一个字符串数组。外面应写须要存储到session中数据的名称。
  2. types:依据指定参数的类型,将模型中对应类型的参数存储到session中。
  3. value:其实和下面的names是一样的。

12.SpringMMV中有个类把视图和数据都合并的一起的,叫什么?

  1. 应用ModelAndView类存储解决完后的后果数据,以及显示该数据的视图。从名字上看ModelAndView中的Model代表模型,View代表视图,从名字看就很好地解释了该类的作用。Controller处理器调用模型层解决完用户申请后,把后果数据存储在该类的model属性中,把要返回的视图信息存储在该类的view属性中,而后把ModelAndView返回给前端控制器。前端控制器通过调用配置文件中定义的视图解析器,对该对象进行解析,最初把后果数据显示在指定的页面上。ModelAndView构造方法能够指定返回的页面名称。
    也能够通过setViewName()办法跳转到指定的页面 。应用addObject()设置须要返回的值,addObject()有几个不同参数的办法,能够默认和指定返回对象的名字。

零碎分为体现层(UI):数据的展示,操作页面,申请转发。
业务层(服务层):封装业务解决逻辑
长久层(数据拜访层):封装数据拜访逻辑
各层之间的关系: 表示层通过接口调用业务层,业务层通过接口调用长久层,这样,当下一层发生变化扭转,不影响上一层的数据。 MVC是一种体现层的架构

定义拦截器,实现HandlerInterceptor接口。接口中提供三个办法。

preHandle :进入 Handler办法之前执行,用于身份认证、身份受权,比方身份认证,如果认证通过示意以后用户没有登陆,须要此办法拦挡不再向下执行
postHandle:进入Handler办法之后,返回modelAndView之前执行,利用场景从modelAndView登程:将专用的模型数据(比方菜单导航)在这里传到视图,也能够在这里对立指定视图
afterCompletion:执行Handler实现执行此办法,利用场景:对立异样解决,对立日志解决

事务就是对一系列的数据库操作(比方插入多条数据)进行对立的提交或回滚操作,如果插入胜利,那么一起胜利,如果两头有一条出现异常,那么回滚之前的所有操作。 

这样能够防止出现脏数据,避免数据库数据呈现问题。 开发中为了防止这种状况个别都会进行事务管理。Spring中也有本人的事务管理机制,个别是应用TransactionMananger进行治理,能够通过Spring的注入来实现此性能。

sping的事务管理的两种形式:

1、编程式(粒度是到代码块级别);

2、申明式(粒度是到办法级别);

    通过AOP实现,  其本质是对办法前后进行拦挡,而后在指标办法开始之前创立或者退出一个事务,在执行完指标办法之后依据执行状况提交或者回滚事务。申明式事务最大的长处就是不须要通过编程的形式治理事务,这样就不须要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相干的事务规定申明(或通过基于@Transactional注解的形式),便能够将事务规定利用到业务逻辑中。

Spring 通过一个配置文件来形容 Bean 及 Bean 之间的依赖关系,利用 Java 的反射性能实例化 Bean 并建设 Bean 之间的依赖关系 。Sprig 的 IoC 容器在实现这些底层工作的根底上,还提供了 Bean 实例缓存 、 生命周期治理 、Bean 实例代理 、 事件公布 、 资源装载等高级服务 。

Spring是一个轻量级的IoC和AOP容器框架,是为Java应用程序提供基础性服务的一套框架,目标是用于简化企业应用程序的开发,它使得开发者只须要关怀业务需要。

Spring,一种用来简化企业应用级开发的一种开源框架。
简化开发:它对罕用的API做了封装,比方对JDBC的封装,应用Spring JDBC拜访数据库,就不须要思考如何获取连贯和敞开的问题。
解耦:Spring帮咱们管理软件之间的依赖关系,这样对象之间的耦合性就升高了,这样的维护性就失去了进步。
集成其它框架:不便扩大和优化其性能,例如和Mybatis的集成等。

Spring框架是依照设计模式精心打造的,这使得咱们在开发环境中,能不便的应用框架,不必思考后盾是怎么进行的。
Spring容器是Spring框架中一个外围的模块,用来治理对象的创立,销毁和初始化等操作,以及对象之间的依赖关系等。

次要包含以下七个模块:

Spring Context:提供框架式的Bean拜访形式,以及企业级性能(JNDI、定时工作等);
Spring Core:外围类库,所有性能都依赖于该类库,提供IOC和DI服务;
Spring Web:提供了根本的面向Web的综合个性,提供对常见框架如Struts2的反对,Spring可能治理这些框架,将Spring的资源注入给框架,也能在这些框架的前后插入拦截器;
Spring DAO:对JDBC的形象封装,简化了数据拜访异样的解决,并能对立治理JDBC事务;

18. 什么是管制反转(IOC),什么是依赖注入(DI)?

IOC:就是对象之间的依赖关系由容器来创立,对象之间的关系原本是由咱们开发者本人创立和保护的,在咱们应用Spring框架后,对象之间的关系由容器来创立和保护,将开发者做的事让容器做,这就是管制反转。BeanFactory接口是Spring Ioc容器的外围接口。
DI:咱们在应用Spring容器的时候,容器通过调用set办法或者是结构器来建设对象之间的依赖关系。
管制反转是指标,依赖注入是咱们实现管制反转的一种伎俩。

Spring作为以后Java最风行、最弱小的轻量级框架,受到了程序员的热烈欢迎。精确的理解Spring Bean的生命周期是十分必要的。咱们通常应用ApplicationContext作为Spring容器。这里,咱们讲的也是 ApplicationContext中Bean的生命周期。而实际上BeanFactory也是差不多的,只不过处理器须要手动注册。

但具体来说,Spring Bean的生命周期蕴含下图的流程:

对于BeanFactory容器,当客户向容器申请一个尚未初始化的bean时,或初始化bean的时候须要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化。

(2)设置对象属性(依赖注入)

实例化后的对象被封装在BeanWrapper对象中,紧接着,Spring依据BeanDefinition中的信息 以及 通过BeanWrapper提供的设置属性的接口实现属性设置与依赖注入。

Spring会检测该对象是否实现了xxxAware接口,通过Aware类型的接口,能够让咱们拿到Spring容器的一些资源:

如果Bean在Spring配置文件中配置了 init-method 属性,则会主动调用其配置的初始化办法。

以上几个步骤实现后,Bean就曾经被正确创立了,之后就能够应用这个Bean了。

当Bean不再须要时,会通过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()办法。

最初,如果这个Bean的Spring配置中配置了destroy-method属性,会主动调用其配置的销毁办法。

20. Spring框架中都用到了哪些设计模式?

观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个利用。
装璜者模式 : 咱们的我的项目须要连贯多个数据库,而且不同的客户在每次拜访中依据须要会去拜访不同的数据库。这种模式让咱们能够依据客户的需要可能动静切换不同的数据源。

AOP面向切面编程,它是一种思维。它就是针对业务处理过程中的切面进行提取,以达到优化代码的目标,缩小反复代码的目标。 就比方,在编写业务逻辑代码的时候,咱们习惯性的都要写:日志记录,事物管制,以及权限管制等,每一个子模块都要写这些代码,代码显著存在反复。这时候,咱们使用面向切面的编程思维,采纳横切技术,将代码中反复的局部,不影响主业务逻辑的局部抽取进去,放在某个中央进行集中式的治理,调用。 造成日志切面,事物管制切面,权限管制切面。 这样,咱们就只须要关系业务的逻辑解决,即进步了工作的效率,又使得代码变的简洁优雅。这就是面向切面的编程思维,它是面向对象编程思维的一种扩大。

AOP的应用场景: 缓存、权限治理、内容传递、错误处理、懒加载、记录跟踪、优化、校准、调试、长久化、资源池、同步治理、事物管制等。 AOP的相干概念: 切面(Aspect) 连接点(JoinPoint) 告诉(Advice) 切入点(Pointcut) 代理(Proxy): 织入(WeaVing)
Spring AOP的编程原理? 代理机制JDK的动静代理:只能用于实现了接口的类产生代理。 Cglib代理:针对没有实现接口的类产生代理,利用的是底层的字节码加强技术,生成以后类的子类对象。
(1)连接点(Join point):指程序运行过程中所执行的办法。在Spring AOP中,一个连接点总代表一个办法的执行。

(2)切面(Aspect):被抽取进去的公共模块,能够用来会横切多个对象。Aspect切面能够看成 Pointcut切点 和 Advice告诉 的联合,一个切面能够由多个切点和告诉组成。

(3)切点(Pointcut):切点用于定义 要对哪些Join point进行拦挡。

切点分为execution形式和annotation形式。execution形式能够用门路表达式指定对哪些办法拦挡,比方指定拦挡add、search。annotation形式能够指定被哪些注解润饰的代码进行拦挡。

(5)指标对象(Target):蕴含连接点的对象,也称作被告诉(Advice)的对象。 因为Spring AOP是通过动静代理实现的,所以这个对象永远是一个代理对象。

(6)织入(Weaving):通过动静代理,在指标对象(Target)的办法(即连接点Join point)中执行加强逻辑(Advice)的过程。

(7)引入(Introduction):增加额定的办法或者字段到被告诉的类。Spring容许引入新的接口(以及对应的实现)到任何被代理的对象。例如,你能够应用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。

几个概念的关系图能够参考下图:

AOP实现的关键在于代理模式,AOP代理次要分为动态代理和动静代理。动态代理的代表为AspectJ;动静代理则以Spring AOP为代表。

(1)AspectJ是动态代理,也称为编译时加强,AOP框架会在编译阶段生成AOP代理类,并将AspectJ(切面)织入到Java字节码中,运行的时候就是加强之后的AOP对象。

(2)Spring AOP应用的动静代理,所谓的动静代理就是说AOP框架不会去批改字节码,而是每次运行时在内存中长期为办法生成一个AOP对象,这个AOP对象蕴含了指标对象的全副办法,并且在特定的切点做了加强解决,并回调原对象的办法。

Spring AOP中的动静代理次要有两种形式,JDK动静代理和CGLIB动静代理:

① JDK动静代理只提供接口的代理,不反对类的代理,要求被代理类实现接口。JDK动静代理的外围是InvocationHandler接口和Proxy类,在获取代理对象时,应用Proxy类来动态创建指标类的代理类(即最终真正的代理类,这个类继承自Proxy并实现了咱们定义的接口),当代理对象调用实在对象的办法时, InvocationHandler 通过invoke()办法反射来调用指标类中的代码,动静地将横切逻辑和业务编织在一起;

② 如果被代理类没有实现接口,那么Spring AOP会抉择应用CGLIB来动静代理指标类。CGLIB(Code Generation Library),是一个代码生成的类库,能够在运行时动静的生成指定类的一个子类对象,并笼罩其中特定办法并增加加强代码,从而实现AOP。CGLIB是通过继承的形式做的动静代理,因而如果某个类被标记为final,那么它是无奈应用CGLIB做动静代理的。

(3)动态代理与动静代理区别在于生成AOP代理对象的机会不同,相对来说AspectJ的动态代理形式具备更好的性能,然而AspectJ须要特定的编译器进行解决,而Spring AOP则无需特定的编译器解决。

IoC让相互协作的组件放弃涣散的耦合,而AOP编程容许你把遍布于利用各层的性能分离出来造成可重用的性能组件。

① webServices通过SOAP协定进行参数的接管与返回值的传递。
② SOAP协定在web上提供软件服务,应用WSDL文件进行阐明,通过UDDI进行注册
③ WSDL文件是一个XML文档,用于阐明一组SOAP音讯以及如何替换这些信息,大多数状况下由软件主动生成和应用
④ XML是一种扩大型可标记语言,面向短期长期数据和万维网络。
⑤ UDDI是一个次要针对web服务供应商和使用者的我的项目,在用户可能调用web服务之前,必须确定这个服务蕴含哪些商务办法,找到被调用的接口定义,还要服务端来编制软件;UDDI是一种依据形容文章来疏导零碎查找响应服务的机制,UDDI利用SOAP音讯机制来公布、编译、浏览及查找注册信息,它采纳XML格局来封装各种不同类型的数据,并且发送到注册核心来返回须要的数据。

23. 拦截器和过滤器的区别

① 拦截器inteceptor是基于java的反射机制实现的;
过滤器Filter是基于函数回调实现(filter接口中的doFilter办法是回调函数实现的)
② 拦截器不依赖于servlet容器;
③ 拦截器只能对action申请起作用;
而filter能够对所有申请起作用,filter过滤范畴比拦截器大
④ 拦截器能够拜访action上下文,值栈里的对象;
而过滤器filter不能;
⑤ 在action的生命周期中,拦截器能够屡次被调用;
而过滤器只能在容器初始化时被调用一次;
⑥ 拦截器能够获取IOC容器中的各个bean,而过滤器不行;

(1)、页面传值到控制器有三种形式:

应用Request传值的特点:间接,然而不能主动进行类型转换。

第一、变量名必须和表单组件的name值雷同
第二、能够实现类型转换
第三、进行类型转换时可能会出现异常

应用Bean对象传值的特点:
第一、如果前端提交数据过多,倡议应用此形式
第二、把表单组件的name属性值封装到Bean类中,
第三、办法的参数传递封装类型的对象即可

(2)、控制器传值到页面有三种形式:

第一、能够在ModelAndView构造方法中设置一个Map对象
第二、Map对象通过框架解决后,会把key-value设置到Request对象中。

26. Spring MVC拦截器的三个办法的执行机会是什么?

28. 传入申请如何映射到控制器和办法?

另一方面,在SimpleUrlHandlerMapping中,映射更明确。能够指定URL的数量,并且每个URL能够与控制器显式关联。

顺便说一句,如果你应用正文来配置Spring MVC,那么应该应用@RequestMapping正文将传入申请映射到控制器和处理程序办法。

还能够通过URI门路,查问参数,申请的HTTP办法以及申请中存在的HTTP标头配置@RequestMapping批注。

@RequestParam是一个Spring MVC正文,其被用于提取从URL中控制器的处理程序办法申请参数或查问参数,如下所示:

@RequestParam正文也反对数据类型转换,例如这里能够看到一个String被主动转换为long,但它也可能导致一个异样,如果查问参数不存在或类型不匹配的状况下 还能够应用requried = false使参数成为可选参数,例如@RequestParam(value =“id”,required = false)

Springboot是简化配置,将mybatis中的配置数据源,主配置文件等配置,spring、springMVC的配置文件都用springboot的yml文件配置,极大的简化了配置,使我的项目能够疾速的启动起来。

SpringMVC是通过(model),V(view),C(controller)的构造进行分层,从而实现前后端拆散的成果,而后通过前端控制器(DispatcherServlet),处理器映射器(HandlerMapping),处理器适配器(HandlerAdapter),视图解析器(ViewResolver),将各层有机的组织起来,使每个人都有不同的分工从而放慢了开发的效率。

Spring是由Aop面向切面和IOC管制翻转(又称作DI依赖注入),面向切面是把主办法和其余的一些无关的办法拆散开来,从而达到升高耦合的成果,管制翻转是指将原先是由new创立的对象,各个类之间的依赖较强,将创建对象的权力交托给ioc容器后,由ioc容器来创建对象,使耦合度减小,进步了效率。

2000多G的计算机各行业电子资源分享(继续更新)

2020年微信小程序全栈我的项目之喵喵交友【附课件和源码】

Spring Boot开发小而美的集体博客【附课件和源码】

Java微服务实战296集大型视频-谷粒商城【附代码和课件】

Java开发微服务畅购商城实战【全357集大我的项目】-附代码和课件

最全最具体数据结构与算法视频-【附课件和源码】

}

先列题目,然后加答案。

,遇到宏任务放到宏队列(macrotask),遇到微任务放到微队列(microtask。主线程执行完毕,调用栈被清空,这个时候就会从微队列里取出位于首位的回调放入执行栈开始执行,微队列长度-1,然后依次执行队列里的回调任务直到所有任务被执行完毕,此时微队列为空,调用栈也为空,这时再从宏队列里取出位于首位的一个任务,然后放入调用栈执行,执行完毕之后,再去取微队列里的任务,按照之前的步骤循环。

2. js为什么要实现成单线程的,有什么好处?

原因:作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。
单线程的好处:设想,如果 Javascript 被设计为多线程的程序,那么操作 DOM 必然会涉及到资源的竞争,那么这门语言必然会被实现的非常臃肿。在客户端中跑这么一门语言的程序,资源消耗和性能都将是不乐观的,同时在客户端实现多线程不是刚需。
设计成单线程,并辅以完善的异步队列来实现,那么运行成本就会比多线程的设计要小很多了。

  1. 进程是资源分配的最小单位,线程是程序执行的最小单位(资源调度的最小单位)
  2. 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。
    而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
  3. 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
  4. 但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

4. 闭包的含义、原理、优缺点、使用场景、如何回收

含义:闭包是函数和声明该函数的词法环境的组合。这个环境包含了这个闭包创建时所能访问的所有局部变量。
闭包就是一个函数,这个函数能够访问其他函数的作用域中的变量,是函数内部和外部之间的桥梁。
原理:函数的作用域是一条作用域链,而且作用域链是有顺序的,我们称之为链式作用域结构。在js中,外部不能读取到内部的变量,而内部可以读取到外部的变量。利用这个特性,闭包可以将读取到的属性扔到外部使用。
优点:可以读取函数内部的变量,让这些变量的值始终保持在内存中。
缺点:闭包对脚本性能有负影响,不能滥用。并且闭包会在父函数外部,改变父函数内部变量的值。

  1. 给对象设置私有变量并且利用特权方法去访问私有属性
  2. 采用函数引用方式的setTimeout调用,原生的setTimeout传递的第一个函数不能带参数,通过闭包可以实现传参效果
  3. 单例模式的实现,确保全局只有一个实例对象
  4. module仿模块化,使用闭包封装“私有”状态和组织。只用返回一个公有的API,其他的所有规则都在私有闭包里,防止泄露到全局作用域,并且可以减少与别的开发人员的接口发生冲突。

5. JS数据类型有哪些,怎么做类型判断?

6. 类型转换有哪些?

执行上下文是评估和执行 JavaScript 代码的环境的抽象概念。每当 Javascript 代码在运行的时候,它都是在执行上下文中运行。
JavaScript 中有三种执行上下文类型:
全局执行上下文 — 这是默认或者说基础的上下文,任何不在函数内部的代码都在全局上下文中。它会执行两件事:创建一个全局的 window 对象(浏览器的情况下),并且设置 this 的值等于这个全局对象。一个程序中只会有一个全局执行上下文。
函数执行上下文 — 每当一个函数被调用时, 都会为该函数创建一个新的上下文。每个函数都有它自己的执行上下文,不过是在函数被调用时创建的。函数上下文可以有任意多个。每当一个新的执行上下文被创建,它会按定义的顺序执行一系列步骤。
Eval 函数执行上下文 — 执行在 eval 函数内部的代码也会有它属于自己的执行上下文。

创建执行上下文分为两个阶段:1.创建阶段  2.执行阶段

在创建阶段会发生三件事:

  1. this 值的决定,即我们所熟知的 This 绑定。

8. new操作符做了什么

  1. 执行构造函数中的代码,为空对象添加属性A.call(o);,也可以理解为将构造器函数内部this指向新建的空对象。
  2. 返回添加属性后的对象。

9. 解释构造函数、对象、原型链之间的关系

每个构造函数都有一个原型对象,原型对象上包含着一个指向构造函数的指针,而实例都包含着一个指向原型对象的内部指针。通俗的说,实例可以通过内部指针访问到原型对象,原型对象可以通过constructor找到构造函数。

10. 继承的几种方式以及优缺点

  1. 缺点:引用类型的属性被所有实例共享;在创建 Child 的实例时,不能向Parent传参

  2. 优点:避免了引用类型的属性被所有实例共享,并且可以在 Child 中向 Parent 传参
    缺点:方法都在构造函数中定义,每次创建实例都会创建一遍方法。

  3. 优点:融合原型链继承和构造函数的优点,是 JavaScript 中最常用的继承模式
    缺点:调用两次父级的构造函数

  4. 缺点:包含引用类型的属性值始终都会共享相应的值,这点跟原型链继承一样。

  5. 缺点:跟借用构造函数模式一样,每次创建对象都会创建一遍方法

  6. 优点:这种方式的高效率体现它只调用了一次 Parent 构造函数,并且因此避免了在 Parent.prototype 上面创建不必要的、多余的属性。与此同时,原型链还能保持不变;因此,还能够正常使用 instanceof 和 isPrototypeOf。开发人员普遍认为寄生组合式继承是引用类型最理想的继承范式。

11. 实现原型式继承

12. 实现构造函数继承

13. 面向对象的属性

14. 设计模式有哪些,项目中使用到哪些

  1. 策略模式,封装不同的计算方法,封装调用接口,常见购物车商品价格计算
  2. 发布订阅模式,参考vue响应式原理

15. 浏览器事件有哪些过程? 为什么一般在冒泡阶段, 而不是在捕获阶段注册监听? addEventListener 参数分别是什么 ?

过程:事件捕获阶段、处在目标阶段、冒泡阶段

IE低版本不支持捕获,为了兼容性,一般都写冒泡

addEventListener可接受3个参数:要处理的事件名、作为事件处理程序的函数和一个布尔值。布尔值若为true,表示在捕获阶段调用事件处理程序;若为false,表示在冒泡阶段调用事件处理程序

17. js中的装箱和拆箱了解吗?

装箱:把基本数据类型转化为对应的引用数据类型的操作。每当读取一个基本类型的时候,后台就会创建一个对应的基本包装类型对象,从而让我们能够调用一些方法来操作这些数据。
所以直接定义一个基础类型字符串也能调用方法。

拆箱:将引用类型对象转换为对应的值类型对象
如果是自定义的对象,你也可以自定义它的valueOf()或者toString()方法,实现对这个对象的拆箱。

18. 节流与防抖原理

防抖与节流函数是一种最常用的 高频触发优化方式,能对性能有较大的帮助。

防抖 (debounce): 将多次高频操作优化为只在最后一次执行,通常使用的场景是:用户输入,只需再输入完成后做一次输入校验即可。

节流(throttle): 每隔一段时间后执行一次,也就是降低频率,将高频操作优化成低频操作,通常使用场景: 滚动条事件 或者 resize 事件,通常每隔 100~500 ms执行一次即可。

19. 面向对象和非面向对象有什么区别

面向对象是对事件处理的抽象,方便扩展设计,非面向对象一般是针对流程的处理,没有抽象概念。

20. 高阶函数是什么,怎么去写一个高阶函数

只需满足以下任意一个条件,即是高阶函数:

  1. 接受一个或多个函数作为输入
  2. return 返回另外一个函数

21. 模块化介绍一下,什么是编译时优化?模块化的演化过程?

AMD是依赖前置,在define里先定义好依赖模块,然后在回调函数里做引用

CMD是依赖后置,define了一个模块,在里面什么时候用到模块了,什么时候再require

require是动态编译,运行时才加载,import是编译时就要加载,属于静态编译。但是目前已经有import()函数在提案内,可以实现动态加载了,此外还有更新的提案,await提升,之前await只能在标记async的函数内使用,现在的提案是await可以单独使用,import()动态加载时还需要写then做后续处理,现在不用了,写法简化很多。

PWA并不是单指某一项技术,你更可以把它理解成是一种思想和概念,目的就是对标原生app,将Web网站通过一系列的Web技术去优化它,提升其安全性,性能,流畅性,用户体验等各方面指标,最后达到用户就像在用app一样的感觉。

PWA中包含的核心功能及特性如下

// 获取除第一个参数之外的其余参数,然后执行 // 处理函数成为构造函数的情况 // 构造函数 return 的是一个引用值的话,则 new 操作符返回的就是这个引用值
  1. 操作dom有哪些方法?
  2. 怎么用原生js实现一个轮播图,以及滚动滑动?
  3. 怎么实现上传下载的功能?
//假设要获取的cookie的名字是name,则遍历数组找到名字所对应的值

31. 怎么打断点,如何确定一个结果来自于哪个函数

32. 简述自定义事件实现方法

36. 编写函数 convert(money) ,传入金额,将金额转换为千分位表示法

37. js浮点数运算不精确,如何解决

我们进行运算的时候,实际上是把数字转换为了二进制进行的,所以我们把0.1和0.2转换为二进制:
这里可以看出转换为二进制是一个无限循环的数字,单在计算机中对于无限循环的数字会进行舍入处理的,进行双精度浮点数的小数部分最多支持52位。然后把两个2进制的数进行运算得出的也是一个二进制数值,最后再把它转换为十进制。保留17位小数,所以0.1+0.2的值就成了 0.00004。  0.1+0.1的值成了0.00000,全是0的时候可以省略,就成了0.2。
解决办法最简单的是直接toFixed,有时结果也是不准确的,所以我们还可以直接截取小数点后面的值直接乘以10的倍数,得到相加结果再除以相同的10的倍数。

38. 实现函数的柯里化

39. 前端存储方式,以及它们之间的优缺点

40. 怎么从十万个节点中找到想要的节点,怎么快速在某个节点前插入一个节点?

41. 如何找到一个字符串中最长的两个字符串?

42. 正则用过吗?exec, 匹配一个手机号?去空格?

43. 给你一亿个数,是连续的,怎么找出两个不存在的数

45. 做一个表格,一分钟刷新一次,怎么实现

46. 有了解WebWorker的实现原理吗,私下有实践过吗

直接来说,WebWorker可已开启多线程操作,但是不能操作dom。多线程之间可以通过postMessage传递信息,监听onMessages获取信息。

47. 平时做项目有没有考虑过内存的问题?怎么解决的?

48. 异步处理的方案有哪些?

//当前元素,在原始数组中的第一个索引==当前索引值,否则返回当前元素

4. 有哪些排序算法,时间复杂度是多少?什么时候快排的效率最低?

5. 改变数组和不改变数组的方法分别是哪些?

6. 给定一个数组和一个正整数N,求一个和小于N的最长连续子数组

7. 给定两个有序数组,合并为一个有序数组。不许使用 js 的 concat 和 sort 方法

**当数组长度小于等于10的时候,采用插入排序,大于10的时候,采用快排。
对于长度大于1000的数组,采用的是快排与插入排序混合的方式进行排序的,因为,当数据量很小的时候,插入排序效率优于快排。**

9. 不产生新数组,删除数组里的重复元素

10. 冒泡排序和快速排序的区别

冒泡排序是从最底层元素开始比较du,(与其上的元素比较)小于就往上再zhi比,大于就交换,再用较小dao的往上比较,直到最高层,第一次把最小的放到最上层,第二次把第二小的放到第二层,以次类推。

快速排序是先找到一个轴值,比较时把所有比轴值小的放到轴值的左边,比轴值大的放到右边,再在两边各自选取轴值再按前面排序,直到完成。

  1. 箭头函数,this指向
  2. 新增的数据结构有哪些?
  3. 解释ES6的暂时性死区

同源策略导致跨域,解决办法: JSONP、nignx反向代理、CORS配置(会有一次预检请求)

3. 页面加载的过程(输入URL后发生了什么?)

4. TCP三次握手和四次挥手,拥塞控制

6. HTTP请求头和响应头都有些什么字段?

304-延伸到浏览器缓存问题
307:临时重定向,请求体不会发生变化

11. 进程通信,有名和匿名管道

进程之间通信,就实现手段上来看,有以下几种:

  1. 匿名管道(有亲缘关系进程)
  2. 有名管道(无亲缘也可以)

PIPE匿名管道用于具有血缘关系之间的进程进行通信。
1.半双工通信,同一时间数据只能向一个方向传输,具有固定的读端和写端。
2.只能用于具有亲缘关系的进程间通信(父子或者公共祖先)。
3.本质是内核中的一块缓冲区。
4.自带“同步互斥机制”,同时只有一个进程能够读到数据。
6.管道提供字节流服务。

FIFO:命名管道(也是半双工),每个FIFO都有一个路径名与之关联,从而允许无亲缘关系的进程访问同一个FIFO

  1. 可以在没有亲缘关系的进程间交换数据
  2. FIFO有路径名与之关联,它以一种特殊设备文件形式存在于文件系统中。
  3. 会出现抢读,写一次,就要去读,不管是谁读,里面的数据都会被清理

cookie由服务器生成,保存在客户端浏览器,容易被劫持,不安全
session保存在服务端,每个sessionID都是唯一的,当用户量太大时,占用服务器资源,较安全
token的工作原理:
1.客户端第一次请求时,发送用户信息到服务器。服务器对用户信息使用HSA256算法及密钥进行签名,再将这个签名和数据一起作为token返回给客户户端。
2.服务端不再保存token,客户端保存token。
3.当客户端再次发送请求时,在请求信息中将token一起发送给服务器。
4.服务器用同样的HSA256算法和密钥,对数据再计算一次签名,和token的签名做比较
5.如果相同,服务器就知道客户端登录过,则反之。

  1. 如果浏览器关闭了再打开, 请求还是from cache吗?

一个服务器与浏览器之间的中间人角色,如果网站中注册了service worker那么它可以拦截当前网站所有的请求,进行判断(需要编写相应的判断程序),如果需要向服务器发起请求的就转给服务器,如果可以直接使用缓存的就直接返回缓存不再转给服务器。从而大大提高浏览体验。

  • 基于web worker(一个独立于JavaScript主线程的独立线程,在里面执行需要消耗大量资源的操作不会堵塞主线程)
  • 在web worker的基础上增加了离线缓存的能力
  • 本质上充当Web应用程序(服务器)与浏览器之间的代理服务器(可以拦截全站的请求,并作出相应的动作->由开发者指定的动作)
  • 创建有效的离线体验(将一些不常更新的内容缓存在浏览器,提高访问体验)
  • 由事件驱动的,具有生命周期
  • 并且可以让开发者自己控制管理缓存的内容以及版本
  1. token 的刷新机制是怎么样的, 为什么这么设置?
  2. 静态文件的浏览器缓存如何实现
一般是对服务器的数据做改变,常用来数据的提交,新增操作
put请求与post一样都会改变服务器的数据,但是put的侧重点在于对于数据的修改操作,但是post侧重于对于数据的增加
put的更新是全部更新,patch可以执行部分更新,只更新接收到的数据
属于浏览器的预检请求,查看服务器是否接受请求,预检通过后,浏览器才会去发get,post,put,delete等请求。非简单请求才会发送遇见请求

put请求与post一样都会改变服务器的数据,但是put的侧重点在于对于数据的修改操作,但是post侧重于对于数据的增加

  1. get是从服务器上获取数据,post是向服务器传送数据。
  2. 传参方式不同,一个参数挂在url上,一个参数在请求体里。
  3. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
  4. GET产生一个TCP数据包,POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
  1. 反向代理知道么,Nginx
  1. 组件间的通信方式及原理
  2. MVC和MVVM了解吗?有什么区别?
  3. Vue是怎么实现对数组变化的检测的

6. key的作用是什么?

key的作用主要是为了高效的更新虚拟DOM。另外vue中在使用相同标签名元素的过渡切换时,也会使用到key属性,其目的也是为了让vue可以区分它。

  1. 聊一下高阶组件 hoc
  2. 聊一聊组件设计, 领域模型
  3. 原生事件和 React事件的区别

就是把一些js模块给独立出一个个js文件,然后需要用到的时候,再创建一个script对象,加入到document.head对象中就可,浏览器会自动帮我们发起请求,去请求这个js文件,然后写个回调函数,让请求到的js文件做一些业务操作。

目前最常用的配合Babel一起使用的polyfill是babel-polyfill,它会”加载整个polyfill库”,针对编译的代码中新的API进行处理,并且在代码中插入一些帮助函数。

babel-polyfill解决了Babel不转换新API的问题,但是直接在代码中插入帮助函数,会导致污染了全局环境,并且不同的代码文件中包含重复的代码,导致编译后的代码体积变大。
Babel为了解决这个问题,提供了单独的包babel-runtime用以提供编译模块的工具函数, 启用插件babel-plugin-transform-runtime后,Babel就会使用babel-runtime下的工具函数。垫片也是即用即插。这样可以避免自行引入polyfill时导致的污染全局命名空间的问题。

37. node 的多线程,高并发,安全

由于node 是单进程的,无法充分利用多核 CPU 的性能,一般会使用 cluster 模块,进行多进程的部署。在多进程的环境下,又会带来一些并发的问题。进程之间的数据是不共享的,但是依然会有很多共享的资源,比如文件系统,数据库等。对于这些资源的并发访问和修改依然会导致问题。
所以在 cluster 模式下,需要更可靠的锁机制,保证对多个 node 实例,一次只能执行一个异步函数。为了实现这一点,仅仅依赖单线程的 node 是不可行的,需要引入外部的状态管理。Redlock 算法提供了一种基于redis 的分布式锁的实现。关于分布式锁和redlock算法的详细介绍可以参考这个链接

40. 说说排查内存泄露的方法

内存泄露通常有两种情况,一种是容易复现的,一种是不容易复现的。
对于容易复现的我们在测试环境中模拟排查即可。
对于不容易复现的我们就要借助内存快照,可以使用devtool查看内存快照,heapdump保存内存快照。heapdump保存的内存快照只会有Node环境中的对象,如果使用node-inspector快照中就会包含前端变量,容易造成干扰。

42. 小程序跟 h5 的区别是什么? [小程序底层实现]

46. axios 为什么既可以在浏览器发请求,又可以在node层发请求?

47. 客户端渲染和服务端渲染的区别

使用导航守卫的钩子上报数据

4. 如何在用户刷新、跳转、关闭浏览器时向服务端发送统计的数据?

  1. 发出的是异步请求,并且是POST请求,后端解析参数时,需要注意处理方式;
  2. 发出的请求,是放到的浏览器任务队列执行的,脱离了当前页面,所以不会阻塞当前页面的卸载和后面页面的加载过程,用户体验较好;
  3. 只能判断出是否放入浏览器任务队列,不能判断是否发送成功;

5. 错误日志上报遇到的问题.

6. 负载均衡方式和容错机制

7. 怎么计算在一个页面上的停留时间

1. 移动端如何优化首页白屏时间过长 ?

2. 移动端优化方式? 离线包是如何实现的?

  • API注入,Native 直接在 JS 上下文中挂载数据或者方法

    • 延迟较低,在安卓4.1以下具有安全性问题,风险较高
    • 兼容性好,但延迟较高,且有长度限制

5. 怎么排查交互中的错误?

6. 浏览器内核有哪些,移动端用的是哪个?

7. 移动端页面适配解决方案

1. 前端安全方面有没有了解?XSS和CSRF如何攻防?

1. 文件指纹怎么生成?

npx是执行Node软件包的工具,它从 npm5.2版本开始,就与npm捆绑在一起。
npx 想要解决的主要问题,就是调用项目内部安装的模块。

  • 帮你在本地(可以是项目中的也可以是本机的)寻找这个 command

    • 找到了: 就用本地的版本
    • 没找到: 直接下载最新版本,完成命令要求
  • 使用完之后不会在你的本机或者项目留下任何东西

package.json文件描述了一个NPM包的所有相关信息,包括作者、简介、包依赖、构建等信息。格式必须是严格的JSON格式。
package.json文件指定了项目的版本,依赖文件,可运行脚本,入口文件等等

8. 能写一个二叉树么,怎么去遍历

9. 伪类知道吗,有哪些?

11. 二维码怎么工作的,扫描pc端的二维码,怎么让pc端登录?

12. 怎么做一个实时的聊天系统

13. 当消息有延迟的时候,怎么保证消息的正确顺序?

18. 了解盒模型吗?

21. 维护的公共组件需要发布大更新, 如何做?

23. 微前端了解吗?

24. 可视化表单了解过么?

26. 平时处理过什么兼容性?

}

我要回帖

更多关于 场景设置有几种方式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信