面试常见问题-前端

April 12th 2019 | 日常

  • http协议
    HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统
    HTTP协议的主要特点可概括如下:
    1.支持客户/服务器模式。
    2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用 的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
    3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加 以标记。
    4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请 求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
    5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。 缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次 连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
  • http的三次握手?

    答:三次握手(three times handshake; three-way handshake)所谓的“三次握手”即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立虚连接。
    
    TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
    
    (1)第一次握手:建立连接时,第三方应用端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。
    
    (2)第二次握手:服务器B收到SYN包,必须确认第三方应用A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。
    
    (3)第三次握手:第三方应用端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,第三方应用端A和服务器B进入ESTABLISHED状态,完成三次握手。
    
    完成三次握手,第三方应用端与服务器开始传送数据
  • 请描述出两点以上XHTML和HTML最显著的区别
    (1)XHTML必须强制指定文档类型DocType,HTML不需要
    (2)XHTML所有标签必须闭合,HTML比较随意
  • HTTP 状态代码含义? 
    200:是请求成功,
    300:重定向
    301:永久移除
    302:临时转移成功,请求的内容已转移到新位置 
    304:未修改
    400:非法请求
    401:代表未授权
    403:服务器拒绝访问 
    404:是文件未找到,
    500:服务器内部错误 
    502:是服务器内部错误。
  • HTTP协议中GET、POST和HEAD的区别?
    HEAD: 只请求页面的首部。
    GET: 请求指定的页面信息,并返回实体主体。
    POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。
    (1)HTTP 定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST。事实上 GET 适用于多数请求,而保留 POST 仅用于更新站点。
    (2)在FORM提交的时候,如果不指定Method,则默认为GET请 求,Form中提交的数据将会附加在url之后,以?分开与url分开。字母数字字符原样发送,但空格转换为“+“号,其它符号转换为%XX,其中XX为 该符号以16进制表示的ASCII(或ISO Latin-1)值。GET请求请提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中;
    GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
    (3)GET 这个是浏览器用语向服务器请求最常用的方法。POST这个方法也是用来传送数据的,但是与GET不同的是,使用POST的时候,数据不是附在URI后面传递的,而是要做为独立的行来传递,此时还必须要发送一个Content_length标题,以标明数据长度,随后一个空白行,然后就是实际传送的数据。网页的表单通常是用POST来传送的。
  • 表单中get与post提交方法的区别?
    GET方式通过URL地址进行传值,在URL地址可以看到传递的值,最大长度也只支持2048字节,相对不安全。
    POST方式通过http协议进行传值,用户无法看到传递的值,最大长度不受限制,相对比较安全。
  • get和post的区别
    1. get是从服务器上获取数据,post是向服务器传送数据。
    2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
    3. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。4.. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
  • Session相关问题
    session共享:
    1.各种web框架早已考虑到这个问题,比如asp.net,是支持通过配置文件修改session的存储介质为sql server的,所有机器的会话数据都从同一个数据库读,就不会存在不一致的问题;
    2.以cookie加密的方式保存在第三方应用端.优点是减轻服务器端的压力,缺点是受到cookie的大小限制,可能占用一定带宽,因为每次请求会在头部附带一定大小的cookie信息,另外这种方式在用户禁止使用cookie的情况下无效.
    3.服务器间同步。定时同步各个服务器的session信息,此方法可能有一定延时,用户体验也不是很好。
    php支持把会话数据存储到某台memcache服务器,你也可以手工把session文件存放的目录改为nfs网络文件系统,从而实现文件的跨机器共享。
    session运行原理:
    (1)当一个session第一次被启用时,一个唯一的标识被存储于本地的cookie中。
    (2)首先使用session_start()函数,PHP从session仓库中加载已经存储的session变量。
    (3)当执行PHP脚本时,通过使用session_register()函数注册session变量。
    (4)当PHP脚本执行结束时,未被销毁的session变量会被自动保存在本地一定路径下的session库中,这个路径可以通过php.ini文件中的session.save_path指定,下次浏览网页时可以加载使用。
    为什么session依赖cookie:
    当用户请求servlet,servlet会首先查看第三方应用端cookie中是否有sessionID,如果有则证明是旧的会话,那么就通过cookie将sessionID发送到服务器,服务器就会根据sessionID到服务器的内存中查找session对象(因为每个session都会有一个sessionID来标识session对象),找到之后然后使用。
    如果cookie中没有sessionID这证明是一个新的会话。服务器就会创建一个新的Session对象,然后将SessionID存放早cookie中,通过cookie把sessionID发送到第三方应用端。第三方应用端下一次访问的时候,就会将SessionID发送到服务器以便再次找到这个session对象,完成会话跟踪所以如果用户将cookie关闭session也将会失效。session是依赖与cookie的。
    与cookie的区别与联系:cookie在第三方应用端保存用户的信息,而session在服务器上保存第三方应用的信息
    session依赖于cookie。如果用户关闭cookie,则session失效,原因是sessionID无法从第三方应用端传递到服务端,也不能从服务端传递到第三方应用端.
    session怎么设置过期时间:
    第一种方法即设置php.ini配置文件,设置session.gc_maxlifetime和session.cookie_lifetime节点属性值
    第二种方法即设置Session时间戳
  • COOKIE、SESSION的联系和区别,多台web服务器如何共享SESSION?
    使用session_start()调用session,服务器端在生成session文件的同时,生成sessionID哈希值和默认值为PHPSESSID的sessionname,
    并向第三方应用端发送变量为(默认的是)PHPSESSID(sessionname),值为一个128位的哈希值。
    服务器端将通过该cookie与第三方应用端进行交互。
    session变量的值经PHP内部系列化后保存在服务器机器上的文本文件中,
    和第三方应用端的变量名默认情况下为PHPSESSID的cookie进行对应交互,
    即服务器自动发送了HTTP头:header('Set- Cookie:session_name()=session_id();path=/');
    即setcookie(session_name(),session_id());当从该页跳转到的新页面并调用session_start()后,
    PHP将检查与给定ID相关联的服务器端存贮的session数据,如果没找到,则新建一个数据集。
  • 禁用COOKIE后SEESION还能用吗?

    可以,Cookie和session都是用来实现会话机制的,由于http协议是无状态的,所以要想跟踪一个用户在同一个网站之间不同页面的状态,需要有这么一个机制----会话机制。
    Cookie:将会话信息的保存到浏览器端。Session:将会话信息保存到服务器端。
    session默认情况下是基于cookie的,对于session来说,每生成一个sessionid,都会将其发送到浏览器端,让后将其保存到cookie当中。
    如果禁用了cookie,则基于cookie的session不好使了,我们可以使用get,传递SID。
  • php在储存session以什么形式存在
    PHP为session的存储提供了三种方式: 文件/ 内存/ 自定义存储,默认是使用文件存储.在访问量大的网站上采用这种方式就不大合 适,因为这样会导致大量的输入输出的冗余.我们可以在php.ini更改配置文件或者php脚本中通过相应的函数来设置session文件的存储类型来改变session文件的存储形式
  • cookie与session的区别
    1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
    2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,虑到安全应当使用session。
    3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。
    4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
    5、所以个人建议:将登陆信息等重要信息存放为SESSION,其他信息如果需要保留,可以放在COOKIE中
  • session与Cookie的区别
    SESSION:
    Session是服务器端保存客户端状态信息的方案
    储存用户访问的全局唯一变量,
    默认保存在文件中,在服务器上的php指定的目录中的的位置进行的存放,
    文件路径由php配置文件的session.save_path指定。
    Session保存在服务器端的文件或数据库中或服务器端内存中
    Session文件是公有的。
    session超时时间在服务器端进行设置。 
    相对比较安全,大小没有限制。
    Session依赖于cookie进行传递。
    每次读取都从服务器进行读取,对服务器有资源消耗。
    Session遍历使用$_SESSION[]取值,
    COOKIE:
    Cookie是客户端保存信息的方案,
    cookie绑定域名
    一般是以文件的形式保存在客户端,
    用户通过手段可以进行修改,不安全,
    单个cookie允许的最大值是3k,
    cookie清空时间是在客户机浏览器设置。 
    cookie遍历使用$_COOKIE[]取值
  • cookie伪造
    你的第三方应用端的cookie被恶意的用户截取到,然后向服务器端发送,并且通过验证,他们就会冒充用户进行登录,这就是cookie伪造
    防cookie伪造:
    现在更通用的做法是使用session来标识用户,也就是说我们为每个第三方应用端生成一个唯一的id,然后在服务端存储这个id所对应的状态。
    这样cookie里面仅仅保存了这个id,而没有任何其他的东西。而且这个id往往还有个特性,它是随机生成,且每次登陆都会产生一个新的。这样就更降低了信息泄漏的风险。
  • javascript能否定义二维数组,如果不能你如何解决?
    javascript不支持二维数组定义,可以用arr[0] = new array()来解决
  • 用javascript取得一个input的值?取得一个input的属性?
    答:
    document.getElementById(‘name’).value;
    document.getElementById(‘name’).getAttribute('name');
  • 什么是JS中的闭包?
       JS的闭包:
          所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
       先看下下面这段代码
       
    这段代码有两个特点:1、函数b嵌套在函数a内部;2、函数a返回函数b。
    这样在执行完var c=a()后,变量c实际上是指向了函数b,再执行c()后就会弹出一个窗口显示i的值(第一次为1)。这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数b,就是说:
      当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
    1这里首先得说下JS的垃圾回收机制:
    在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。因为函数a被b引用,b又被a外的c引用,这就是为什么函数a执行后不会被回收的原因。
    2闭包有什么作用呢?
        1)可以在全局作用域实现对局部变量的引用
        2)可以一直保存我们的变量或函数驻留在内存中,而不会被GC回收
    3闭包的应用场景
       1、保护函数内的变量安全。以最开始的例子为例,函数a中i只有函数b才能访问,而无法通过其他途径访问到,因此保护了i的安全性。
      2、在内存中维持一个变量。依然如前例,由于闭包,函数a中i的一直存在于内存中,因此每次执行c(),都会给i自加1。
    我眼中的闭包:
       函数中函数,且该函数捆绑了一些局部变量,又由于全局变量的引用,会导致函数与变量都不会被回收,这就是我眼中的闭包。
  • 假设a.html和b.html在同一个文件夹下面,用javascript实现当打开a.html五秒钟后,自动跳转到b.html。
    <script>
    function go2b(){
    window.location = “b.html”;
    window.close();
    }
    setTimeout( “go2b()”,5000 ); //5秒钟后自动执行go2b()
    </script>
  • 请使用JavaScript写出三种产生一个Image 标签的方法(提示:从方法、对象、HTML角度考虑)

    (1)var img = new Image();
    (2)var img = document.createElementById(“image”)
    (3)img.innerHTML = “<img src=”xxx.jpg” />”
  • 用Jquery取得一个input的值?取得一个input的属性?
    答:
    $(“input[name='aa']“).val();
    $(“input[name='aa']“).attr(‘name’);
  • JS表单弹出对话框函数是?获得输入焦点函数是? (2分)
    答:弹出对话框: alert(),prompt(),confirm()
    获得输入焦点 focus(),  Onfocus();
  • 请您写一段ajax提交的js代码,或者写出ajax提交的过程逻辑。
    答:
    var xmlhttp;
    if(window.XMLHttpRquest)
    {
    xmlhttp=new XMLHttpRequest();
    }
    else if(window.ActiveXObject)
    {
    xmlhttp=new ActiveXObject(‘Microsoft.XMLHTTP’);
    }
    xmlhttp.open(‘GET’,’1.php?aa=name’,true);
    xmlhttp.onreadystatechange=function(){
    if(xmlhttp.readyState==4)
    {
    if(xmlhttp.status==200)
    {
    var text=xmlhttp.responseText;
    }
    }
    }
    xmlhttp.send(null);
  • 通过JS实现页面的前进和后退操作?
     前进: history.forward();=history.go(1); 
     后退: history.back();=history.go(-1);
    <a href=”javascript:window.history.go(+1)”>前进</a>
    <a href=”javascript:window.history.go(-1)”>后退</a>
  • JS的转向函数是?怎么引入一个外部JS文件?(2分)
    答:window.location.href,