如果同时需要在服务器及终端上都进行识别,是用一个模型还是两个?

整理所有看过的文章的面试题+各种百度每一道题的答案,希望可以有效的帮助别人
本章博客,梳理所有基础的css,js,html,jquery,vue等题,包含面试题,可供参考学习,也督促自我学习

第一阶段:前端和计算机基础相关知识

Referer:指当前请求的URL是在什么地址引用的( 点击超链接的请求的referer为当前超链接所在页面 )

第二阶段:html问题

1、行内元素有哪儿些?块级元素有哪儿些?空元素(void)有哪儿些?

  • localStorage :只要你手动不清缓存或者removeItem,clear等操作。设置的值会一直存在,关闭浏览器后还会存在(前提是你重新打开同样的网址)
  • cookie和session都是用来跟踪浏览器用户身份的会话方式
    cookie保存在浏览器端,session保存在服务器端
    一、 cookie机制:如果不在浏览器中设置过期时间,cookie被保存在内存中,生命周期随浏览器的关闭而结束,这种cookie简称会话cookie,如果在浏览器中设置了cookie的过期时间,cookir被保存在硬盘中,关闭浏览器后,cookie数据仍在,知道过期时间结束才消失

     设置cookie的过期时间
     
     
    可以通过设置domin来实现

     
    部分渲染树(或者整个渲染树)需要重新分析并且节点尺寸需要重新计算。这被称为重排。注意这里至少会有一次重排-初始化页面布局。
    由于节点的几何属性发生改变或者由于样式发生改变,例如改变元素背景色时,屏幕上的部分内容需要更新。这样的更新被称为重绘。

    41. 什么情况会触发重排和重绘

     
     
    添加、删除、更新 DOM 节点
    通过 display: none 隐藏一个 DOM 节点-触发重排和重绘
    通过 visibility: hidden 隐藏一个 DOM 节点-只触发重绘,因为没有几何变化
    移动或者给页面中的 DOM 节点添加动画
    添加一个样式表,调整样式属性
    用户行为,例如调整窗口大小,改变字号,或者滚动。
     
     
    HTML5带来的新协议,通过类似HTTP的请求建立连接。主要目的是可以获取服务端的推送。
    原来的方式可能是使用long poll(即不中断连接一直等待数据),或者是ajax轮询的方式(每隔一段时间发送请求,建立连接,询问是否有新的数据)。这两种方式的缺点在于long poll的阻塞,以及ajax轮询的冗余连接。
    WebSocket的设计思想有点类似于回调,在发送请求升级服务端的协议并收到确认信息后,服务端一有新的信息/数据就会主动推送给客户端,至于要一次HTTP握手便可以建立持久连接
     
    • 都是循环遍历数组中的每一项
      forEach和map方法里每次执行匿名函数都支持3个参数,参数分别是item(当前每一项)、index(索引值)、arr(原数组)

    • map会返回一个新数组,不对原数组产生影响,foreach不会产生新数组,
      map因为返回数组所以可以链式操作,foreach不能

     

    45. js加载位置区别优缺点

     
     
    • html文件是自上而下的执行方式,但引入的css和javascript的顺序有所不同,css引入执行加载时,程序仍然往下执行,而执行到<script>脚本是则中断线程,待该script脚本执行结束之后程序才继续往下执行。
    • 所以,大部分网上讨论是将script脚本放在<body>之后,那样dom的生成就不会因为长时间执行script脚本而延迟阻塞,加快了页面的加载速度。
      但又不能将所有的script放在body之后,因为有一些页面的效果的实现,是需要预先动态的加载一些js脚本。所以这些脚本应该放在<body>之前。
    • 其次,不能将需要访问dom元素的js放在body之前,因为此时还没有开始生成dom,所以在body之前的访问dom元素的js会出错,或者无效
     

    script放置位置的原则“页面效果实现类的js应该放在body之前,动作,交互,事件驱动,需要访问dom属性的js都可以放在body之后

     
     
    • (1)call()、apply()可以看作是某个对象的方法,通过调用方法的形式来间接调用函数,简单来说就是让函数在某个指定的对象下执行。
      (2)bind()就是将某个函数绑定到某个对象上。
      (3)三个方法的作用都是改变函数的执行上下文。

    • (1)call和apply的第一个参数相同,就是指定的对象。这个对象就是该函数的执行上下文。他们的区别在于参数不同,call第一个参数之后的其他所有参数就是传入该函数的值,以逗号分隔;apply只有两个参数,第二个是数组,这个数组就是该函数的参数。
      (2)bind和两者的区别在于bind方法会返回执行上下文被改变的函数而不会立即执行,前两者是直接执行该函数。bind的参数和call相同。

     

    47. 如何理解同步和异步?

     
     
    所有任务都可以分成两种,一种是同步任务(syn),另一种是异步任务(asyn)。同步任务指的是在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程,而进入‘任务队列’的任务,只有‘任务对列’通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。
    运行机制如下:
    • (1)所有同步任务都在主线程上执行,形成一个执行栈
    • (2)主线程外,还存在一个任务队列,只要异步任务有了运行结果,就在任务队列中放置一个事件
    • (3)一旦执行栈中的所有同步任务执行完毕,系统就会读取任务队列,看看里面有哪些事件。那些对应的异步任务就会结束等待状态,而进入执行栈,开始执行
    • (4)主线程上不断重复上面三步。
     
     
    • (1)、构造函数、原型、实例的关系
      构造函数都有一个proptotype属性;
      原型对象prototype里面有一个constructor属性,该属性指向原型对象所属的构造函数;
      实例对象都有一个proto属性,该属性也指向构造函数的原型对象,他是一个非标准属性,不可以用于编程,是浏览器自己使用的。

    • prototype是构造函数的属性,proto是实例对象的属性。这两者都指向同一个对象。

    • (3)原型链属性搜索(什么是原型链)?
      在访问对象的某个成员的时候,会先从对象本身进行查找,如果对象中查找不到,那么就会去它的构造函数的原型对象中进行查找,如果没有找到,那么就会去它的原型对象的原型对象中查找,这样一层一层往上查找,直到object的原型对象的原型是null为止。

     
     
    • 闭包就是能够读取其他函数内部变量的函数。在js中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解为‘定义在一个函数内部的函数’。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。

    • (1)可以读取函数内部的变量
      (2)让这些变量的值始终保持在内存中,因为这些变量始终被引用着,所以不会被垃圾回收机制回收

    • (1)由于闭包使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页性能问题,在IE中可能导致内存泄漏。解决办法:在退出函数之前,将不使用的局部变量全部删除。
      (2)闭包会在父函数外部改变父函数内部变量的值。所以,如果你把父函数当作对象使用,把闭包当作它的公用方法,把内部变量当作它的私有属性,这时候要小心,不能随便改变父函数内部变量的值。

     
     
    (1)MVC中M表示Model模型,V表示view视图, C表示controller控制器;MVVM中M表示model模型,V表示view视图,VM表示viewmodel;
    (2)MVC的看法是界面上的每个变化都是一个事件,我们只需要针对每个事件来写一堆代码,来把用户的输入转换成model里的对象,而这段转换的代码就是controller。简言之,MVC是单向通信,view和model必须通过controller来承上启下。
          
     
    各部分之间的通信都是双向的,view与model不发生联系,而通过viewmodel传递,view非常薄,不部署任何业务逻辑,称为‘被动视图’,即没有任何主动性,而viewmodel非常厚,所有的逻辑都部署在那里。
    MVVM和MVP的主要区别在于,MVVM采用的是双向绑定,view的变动自动反映在viewmodel上,反之亦然。angular、ember、vue都采用这种模式。
          
     
          
     
    第一个是定义了一个函数Person
    第二个是把Person当普通函数执行,并把返回值赋值给person。
    第三个是当做构造函数,通过new关键字创建一个实例对象,赋值给person
          
     
    Function原型上定义的方法,所有函数都可以访问使用。主要应用场景在绑定函数执行的this,并返回一个新函数,可以在我们要调用的时候才执行。原理是函数的预处理思想,把this当做参数预置。
          

    54. 请指出浏览器特性检测,特性推断和浏览器 UA 字符串嗅探的区别?

          
     
     
    特性检测更适合针对实现了特定特性的浏览器进行操作。UA字符串由于被浏览器厂商可以随意修改因此不太靠谱。
          
     
          
    • 无刷新在页面与服务器通信,更新页面,用户体验好。
      异步与服务器通信,不需要打断用户的操作,具有更加迅速的响应能力。
      Ajax使WEB中的界面与应用分离(也可以说是数据与呈现分离),有利于分工合作、减少非技术人员对页面的修改造成的WEB应用程序错误、提高效率、也更加适用于现在的发布系统。
      基于标准化的并被广泛支持的技术,不需要下载插件或者小程序。
    • AJAX干掉了Back和History功能,即对浏览器机制的破坏。
      Ajax技术就如同对企业数据建立了一个直接通道,这使得开发者在不经意间会暴露比以前更多的数据和服务器逻辑。Ajax也难以避免一些已知的安全弱点,诸如跨站点脚步攻击、SQL注入攻击和基于Credentials的安全漏洞等等
      客户端过肥,太多客户端代码造成开发上的成本。
      违背URL和资源定位的初衷,采用了Ajax技术,也许你在该URL地址下面看到的和我在这个URL地址下看到的内容是不同的。
          
     
          
     
        

作用域内所有变量声明都被提到顶部,被提升的变量初始值为undefined,执行到所在行时才真正赋值。

58. 什么是FOUC(无样式内容闪烁)?你如何来避免FOUC?

而引用CSS文件的@import就是造成这个问题的罪魁祸首。IE会先加载整个HTML文档的DOM,然后再去导入外部的CSS文件,因此,在页面DOM加载完成到CSS导入完成中间会有一段时间页面上的内容是没有样式的,这段时间的长短跟网速,电脑速度都有关系。解决方法简单的出奇,只要在之间加入一个或者<script>元素就可以了。

  • 2.0将1.0所有自带的过滤器都删除了,我们需要自己定义过滤器:

    如果想展示JSON数据,不需要调用过滤器了,框架会自动帮我们解析出来;
    2.0过滤器的传参方式不是以前的方式,是以函数传参的方式:

  • 在Vue2.0中丢弃了key,将track-by替换成key属性,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素。

  • 在编写template的时候,2.0必须要用一个根元素(如div)将代码片段包裹起来,否则报错。1.0则不需要。

  • (5)el属性绑定的元素,限制为一个普通的元素,不能再绑定再body、html元素上。

3. vue双向数据绑定的原理

我要回帖

更多关于 服务器怎么维护 的文章