面试题目

Posted by Liu lin on January 2, 2019
  1. 封装函数 f,使 f 的 this 指向指定的对象.
 function bindThis(f, oTarget) {
     return  f.bind(oTarget);
}

  1. 题目描述:获取 url 中的参数
1).参数名称,返回该参数的值 或者 空字符串
2).指定参数名称,返回全部的参数对象 或者 {}
3).果存在多个同名参数,则返回数组
示例1:
输入
http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe
输出
[1, 2, 3]

  1. 查找两个节点的最近的一个共同父节点,可以包括节点自身;
  2. 为 Array 对象添加一个去除重复项的方法;
  3. 请你描述一下 cookies,sessionStorage 和 localStorage 的区别?
  4. iframe有那些缺点?
  5. 你有哪些性能优化的方法?
  6. 说说你对边距折叠的理解?
  7. 说说你对页面中使用定位(position)的理解?

    使用css布局position非常重要,语法如下: position:static | relative | absolute | fixed | center | page | sticky 默认值:static,center、page、sticky是CSS3中新增加的值。 (1)、static 可以认为静态的,默认元素都是静态的定位,对象遵循常规流。此时4个定位偏移属性不会被应用,也就是使用left,right,bottom,top将不会生效。 (2)、relative 相对定位,对象遵循常规流,并且参照自身在常规流中的位置通过top,right,bottom,left这4个定位偏移属性进行偏移时不会影响常规流中的任何元素。 (3)、absolute a、绝对定位,对象脱离常规流,此时偏移属性参照的是离自身最近的定位祖先元素,如果没有定位的祖先元素,则一直回溯到body元素。盒子的偏移位置不影响常规流中的任何元素,其margin不与其他任何margin折叠。 b、元素定位参考的是离自身最近的定位祖先元素,要满足两个条件,第一个是自己的祖先元素,可以是父元素也可以是父元素的父元素,一直找,如果没有则选择body为对照对象。第二个条件是要求祖先元素必须定位,通俗说就是position的属性值为非static都行。 (4)、fixed 固定定位,与absolute一致,但偏移定位是以窗口为参考。当出现滚动条时,对象不会随着滚动。 (5)、center 与absolute一致,但偏移定位是以定位祖先元素的中心点为参考。盒子在其包含容器垂直水平居中。(CSS3) (6)、page 与absolute一致。元素在分页媒体或者区域块内,元素的包含块始终是初始包含块,否则取决于每个absolute模式。(CSS3) (7)、sticky 对象在常态时遵循常规流。它就像是relative和fixed的合体,当在屏幕中时按常规流排版,当卷动到屏幕外时则表现如fixed。该属性的表现是现实中你见到的吸附效果

  8. ``` 1).如何随机打乱一个js数组(使用原生代码) 2).现在有一个二维数组,数组长度和子数组长度均不可知,问:从每一个子数组里面取一个数成一个数组,要求组合不能重复,问一共有多少个组合,请设计一个函数把所有可能出现的组合以数组的形式输出。


11.  深拷贝的作用在于能够实现对于数组和对象的拷贝,不影响拷贝后数据对原数据造成的影响。

12.  自适应和响应式有什么区别和联系.

13. 给定整数 n 和 m,写一个函数 dispatch ,把 1-n 尽量平均地分成m个组
如

var n = 2, m = 2; dispatch(n, m) 得到[[1], [2]]; dispatch(5, 2) // [ [ 1, 2, 3 ], [ 4, 5 ] ] dispatch(10, 6) //[ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ], [ 7, 8 ], [ 9 ], [ 10 ] ]

14.
  • #0
  • #1
  • #2
  • #3
    • #4
  • ...
  • #99998
  • #99999
  • #100000

为 <ul> 添加一个类 bar 删除第 10 个 <li> 在第 500 个 <li> 后面增加一个 <li> , 其文字内容为 点击任意 <li> 弹窗显示其为当前列表中的第几项。 要求:使用原生JS

15. 

当一个用户多次访问我们的网站的时候,我们如何知道多次的访问来源于同一个用户? 如果我们的网站没有登录功能呢? 考虑用户会清空缓存、清空 localStorage,采用何种方法能“尽量”精准的区分用户?

16. 

控制台显示内容为? for (var i = 0; i < 5; i++) { console.log(i); } 控制台显示内容为? for (var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 1000 * i); } 控制台显示内容为? for (var i = 0; i < 5; i++) { (function(i) { setTimeout(function() { console.log(i); }, i * 1000); })(i); } 控制台显示内容为? for (var i = 0; i < 5; i++) { (function() { setTimeout(function() { console.log(i); }, i * 1000); })(i); } 控制台显示内容为? for (var i = 0; i < 5; i++) { setTimeout((function(i) { console.log(i); })(i), i * 1000); } 控制台显示内容为? setTimeout(function() { console.log(1) }, 0); new Promise(function executor(resolve) { console.log(2); for( var i=0 ; i<10000 ; i++ ) { i == 9999 && resolve(); } console.log(3); }).then(function() { console.log(4); }); console.log(5);


17. 

从某数据库接口得到如下值:

{ rows: [ [“Lisa”, 16, “Female”, “2000-12-01”], [“Bob”, 22, “Male”, “1996-01-21”] ], metaData: [ {name: “name”, note: ‘’}, {name: “age”, note: ‘’}, {name: “gender”, note: ‘’}, {name: “birthday”, note: ‘’} ] } rows是数据,metaData是对数据的说明。现写一个函数,将上面的Object转化为期望的数组:

[ {name: “Lisa”, age: 16, gender: “Female”, birthday: “2000-12-01”}, {name: “Bob”, age: 22, gender: “Male”, birthday: “1996-01-21”}, ]


18. 

a = [ {id: 10001, name: “Lisa”, age: 16}, {id: 10002, name: “Bob”, age: 22}, {id: 10003, name: “Alice”, age: 20}, ]; 数组

b = [ {id: 10001, gender: “Female”}, {id: 10002, name: “Bob King”, birthday: “1996-01-22”}, {id: 10005, name: “Tom”, birthday: “2000-01-01”}, ]; 写一个函数按id用b更新a,期望得到的结果为:

[ {id: 10001, name: “Lisa”, age: 16, gender: “Female”}, {id: 10002, name: “Bob King”, birthday: “1996-01-22”, age: 22}, {id: 10003, name: “Alice”, age: 20}, {id: 10005, name: “Tom”, birthday: “2000-01-01”}, ]


19. 

function Foo() { getName = function () { console.log(‘1’); }; return this; } Foo.getName = function () { console.log(‘2’); }; Foo.prototype.getName = function () { console.log(‘3’); }; var getName = function () { console.log(‘4’); }; function getName() { console.log(5); }

Foo.getName();
getName(); Foo().getName(); getName();
new Foo.getName(); new Foo().getName();
new new Foo().getName();

请问上述代码在浏览器环境下,输出结果是多少?

20. 从 URL 输入到页面展现发生了什么?
21. 请你谈谈Cookie的弊端?
22. 说说Http状态码,请求头,请求体,以及各字段的含义.
>1** 信息,服务器收到请求,需要请求者继续执行操作(101,升级为websocket协议) 
2** 成功,操作被成功接收并处理(206,部分内容,分段传输) 
3** 重定向,需要进一步操作以完成请求(301,302重定向;304命中缓存) 
4** 客户端错误,请求包含语法错误或无法完成请求(401,要求身份验证;403,服务器理解客服端需求,但是禁止访问) 
5** 服务器错误,服务器在处理请求的过程中发生了错误

23. 如何实现函数节流和防抖

节流 function throttle(fn, delay) { delay = delay || 50 let statTime = 0 return function () { statTime === 0 && fn.apply(this, arguments) let currentTime = new Date() if (currentTime - statTime > delay) { fn.apply(this, arguments) statTime = currentTime } } }

let throttleFn = throttle(fn)

throttleFn()//只会执行一次 throttleFn() throttleFn() throttleFn() 防抖 function debounce(fn, delay) { delay = delay || 50 let timer = null return function () { let self = this clearTimeout(timer) timer = setTimeout(fn.bind(self, arguments), delay); } }

24.  原生Bind实现

Function.prototype._bind = function (context) { let self = this let args_1 = [].prototype.slice.call(arguments, 1) return function () { let args_2 = [].prototype.slice.call(arguments) let args = args_1.concat(args_2) return self.apply(context, args) } }

25. meta viewport原理;
>参考答案:
>简单来讲,就是移动端视口分为可见视口(也就是我们手机屏幕的大小),layout视口(也就是真实的页面的布局大小),理想视口(就是布局视口就等于可见视口)用户通过缩放等浏览可见视口与布局视口不等的页面来查看内容。



26. float 与display:inline-block的区别.
> 参考答案:
> 共性:都可以使元素处于同一行,并且使元素为块元素,可以自由设置宽高;
不同:
float:脱离文档流;呈环绕排列;上行有空白则后续元素会尽力去填补上;相同元素float:right时,在前面的元素先解析,所以显示上反而在后面的元素右边;
inline-block:在文档流中。行排列不会补位;
首选inline-block,不改变文档流,避免dom重绘;

27. 首屏/白屏时间如何计算;
28. 以下两个代码片段分别输出什么:

  var name = “The Window”;

  var object = {     name : “My Object”,

    getNameFunc : function(){       return function(){         return this.name;       };

    }

  };

  alert(object.getNameFunc()()); //

  var name = “The Window”;

  var object = {     name : “My Object”,

    getNameFunc : function(){       var that = this;       return function(){         return that.name;       };

    }

  };

  alert(object.getNameFunc()());

29. js 的事件模型
>参考方向:
>DOM0级模型/IE事件模型/DOM2模型  事件对象和事件代理

假设有一个 UL 的父节点,包含了很多个 Li 的子节点:

  • Item 1
  • Item 2
  • Item 3
  • Item 4
  • Item 5
  • Item 6

当我们的鼠标移到Li上的时候,需要获取此Li的相关信息并飘出悬浮窗以显示详细信息; 更简单的方法是使用事件代理机制,当事件被抛到更上层的父节点的时候,我们通过检查事件的目标对象(target)来判断并获取事件源Li。下面的代码可以完成我们想要的效果: document.getElementById(“parent-list”).addEventListener(“click”,function(e) { // 检查事件源e.targe是否为Li if(e.target && e.target.nodeName.toUpperCase == “LI”) { // 真正的处理过程在这里 console.log(“List item “,e.target.id.replace(“post-“),” was clicked!”); } }); ```

  1. xss和crsf的原理以及怎么预防.
  2. js手写一个排序算法动态排序的动画;(较难)

  3. 实现一个promise类;(较难,主要考察对promise的理解和实现思路)

计算机网络

  • 状态码 状态码

      1XX:信息状态码
      2XX:成功状态码
      3XX:重定向
      4XX:客户端错误
      5XX: 服务器错误
    

    常见具体状态码

状态码 含义
100 Continue 客户端应当继续发送请求。
200 OK: 请求成功,请求所希望的响应头或数据体将随此响应返回
202 Accepted 客户端应当继续发送请求。
301 Moved Permanently 永久移除
304 Not Modified(还是要访问服务器) 客户端有缓冲的文档并发出了一个条件性的请求
400 Bad Request 服务器未能理解请求
401 Unauthorized 被请求的页面需要用户名和密码
403 Forbidden 对被请求页面的访问被禁止。
500 Internal Server Error 请求未完成。服务器遇到不可预知的情况。
502 Bad Gateway 请求未完成。服务器从上游服务器收到一个无效的
504 Gateway Timeout 网关超时。
  • 浏览器访问页面发生了什么-详述 > 参考文献:从输入URL到页面加载的过程

  • DNS解析过程详解

      1、在浏览器中输入www.example.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。 
        
      2、如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。 
        
      3、如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。 
        
      4、如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
        
      5、如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13组根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(example.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找example.com域服务器,重复上面的动作,进行查询,直至找到www.example.com主机。 
        
      6、如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。
    
  • Css水平居中

      基础布局对以后的开发很有作用。
    
      1. 自动空白边居中
          缺点:IE5/6不支持,需要hack,并需要对两个元素添加样式
            
          <body> <div id="wrapper"> </div></body>
            
          body{
              text-align: center; /*text-align:center让IE中的元素居中*/
              min-width: 760px; 
          }
          .wrapper{
              margin: 0 auto;
              width: 720px;
              text-align: left;       /* 防止继承父类 */
          }
    
      2. 使用定位和负值空白边
            
          .wrapper{
              position: relative;
              width: 720px;
              left: 50%;
              margin-left: -360px;
              //对应的垂直居中也好处理了
              top: 50%;
          }
            
      3. 神奇的弹性盒子 flex
        
          IE10+,Android2.1+ ,IOS safire3.2(添加-webkit-)兼容,所以目前移动端可以大量使用。
        
          body{
              display: flex;
              justify-content: center;  //水平居中
              //垂直居中
              align-items: center;   //当然需要设置容器的高度值
          }
    
  • BFC BFC(box , formatting context),块级格式化上下文,一个创建了新的BFC的盒子是独立布局的,盒子里面的子元素的样式不会影响到外面的元素。在同一个 BFC 中的两个毗邻的块级盒在垂直方向(和布局方向有关系)的 margin 会发生折叠。它决定了元素如何对其内容进行布局,以及与其他元素的关系和相互作用。

      BFC布局规则
    
      1.内部的Box会在垂直方向,一个接一个地放置。
      2.Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠
      3.每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。
      4.BFC的区域不会与float box重叠。(所以有左边宽度自适应)
      5.BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之也如此。
      6.计算BFC的高度时,浮动元素也参与计算
    
          <b>哪些元素会触发BFC</b>
          根元素
          float属性不为none
          position为absolute或fixed
          display为    inline-block, table-cell, table-caption, flex, inline-flex
          overflow不为visible
    
          <b>IE如何解决?Layout </b> 
              position:absolute;
              float: left|right;
              display: inline-block;
              width: value;
              height: value;
              zoom:value(非normal);  //通常zoom:1;
    
    
      具有以上优点,BFC实际中的作用
            
          自适应布局、清除浮动、防止margin重叠。
    
  • 布局问题

    > 1)**响应式布局原理**
         检测设备,根据不同的设备采用不同的css,而且css都是采用的百分比的,而不是固定的宽度。
         因为大屏幕的移动设备越来越普及。而自适应布局已经无法胜任各种浏览需求。响应式设计的目的是尽可能以最好的布局显示您的数据,以实现用户友好的 Web 页面。
         现在CSS3有了个更为实用的 media query。而移动终端的浏览器(都是基于webkit内核的浏览器)基本已经完全支持了css3.他可以为你获取各种终端的数据。
         栅栏系统(响应式)
         响应式图片
         浏览器获取用户终端的屏幕尺寸、分辨率逻辑处理后输出适应的图片,如屏幕分辨率320*480,那么我们匹配给它的是宽度应小于320px的图片。如果终端屏幕的DPI(device pixels)DPI详解值很高,也就是高清屏,那么我们就得输出2倍分辨率的图形(宽:640px);以保证在高清屏下图形的清晰度。各种移动终端的屏幕参数可通过 http://screensiz.es/phone查询。
          解决方案:响应式图形的草案:新定义标签<picture>。
             静态、自适应、流式、响应式四种网页布局有什么区别              
            **自适应布局(Adaptive)**的特点是分别为不同的屏幕分辨率定义布局。布局切换时页面元素发生改变,但在每个布局中,页面元素不随窗口大小的调整发生变化。
            你可以把自适应布局看作是静态布局的一个系列。
         **流式布局(Liquid Layout)**
            流式布局(Liquid)的特点(也叫"Fluid") 是页面元素的宽度按照屏幕进行适配调整,主要的问题是如果屏幕尺度跨度太大,那么在相对其原始设计而言过小或过大的屏幕上不能正常显示。
         **响应式布局(Responsive Layout)**
            分别为不同的屏幕分辨率定义布局,同时,在每个布局中,应用流式布局的理念,即页面元素宽度随着窗口调整而自动适配。
            把响应式布局看作是流式布局和自适应布局设计理念的融合
    
  • CSS3新特性

    选择器,文本、多列布局、渐变效果、css盒子、边框、背景、动画、转换

其他

  • 项目目录结构为何是现在这个样子,每个部分的含义是什么样的?
  • 业务代码是如何组织的?当业务复杂的时候,这样组织还可以么?
  • 工程化是如何做的?
  • 构建流程是怎么样的?对于构建工具了解么?
  • 上线流程是怎么样的?
  • 本地开发和部署有什么区别?
  • git 使用规范是怎么样的?怎么做好分支管理?
  • 怎么做好团队协作?
  • 前后端如何分工的?如何联调的?跨域如何做?
  • 产品功能是如何产生的?你在其中的角色是怎么样的?
  • 你们的研发流程是怎么样的?
  • 如果增加一个搜索框,如何解决快速输入导致频繁发起 ajax 请求的问题?
  • 这个项目有哪些技术上的难点?
  • 动画的实现方案有哪些?有哪些动画优化的方案?
  • 性能优化有哪些?
  • 用户键入不安全的内容怎么办?常见的安全问题有哪些?
  • 经典面试题『某上海客户说,他的 h5 页面打不开,你如何解决这个问题?』