Skip to the content.

面试题集合


  1. Doctype作用?标准模式与兼容模式各有什么区别?

    1. <!DOCTYPE>声明位于位于HTML文档中的第一行,处于 < html> 标签之前。告知浏览器的解析器用什么文档标准解析这个文档。DOCTYPE不存在或格式不正确会导致文档以兼容模式呈现。
    1. 标准模式的排版 和JS运作模式都是以该浏览器支持的最高标准运行。在兼容模式中,页面以宽松的向后兼容的方式显示,模拟老式浏览器的行为以防止站点无法工作
  2. HTML5 为什么只需要写 <!DOCTYPE HTML>?

    HTML5 不基于 SGML,因此不需要对DTD进行引用,但是需要doctype来规范浏览器的行为(让浏览器按照它们应该的方式来运行); 而HTML4.01基于SGML,所以需要对DTD进行引用,才能告知浏览器文档所使用的文档类型。

  3. 行内元素有哪些?块级元素有哪些? 空(void)元素有那些?

    CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,如div的display默认值为“block”,则为“块级”元素;span默认display属性值为“inline”,是“行内”元素。

    1. 行内元素有:a b span img input select strong(强调的语气)
    2. 块级元素有:div ul ol li dl dt dd h1 h2 h3 h4…p
    1. 常见的空元素: < br> < hr> < img> < input> < link> < meta> 鲜为人知的是: < area> < base> < col> < command> < embed> < keygen> < param> < source> < track> < wbr>
  4. 页面导入样式时,使用link和@import有什么区别?

    1. link属于XHTML标签,除了加载CSS外,还能用于定义RSS, 定义rel连接属性等作用;而@import是CSS提供的,只能用于加载CSS;
    2. 页面被加载的时,link会同时被加载,而@import引用的CSS会等到页面被加载完再加载;
    3. import是CSS2.1 提出的,只在IE5以上才能被识别,而link是XHTML标签,无兼容问题;
  5. 介绍一下你对浏览器内核的理解?

    主要分成两部分:渲染引擎(layout engineer或Rendering Engine)和JS引擎。

    渲染引擎:负责取得网页的内容(HTML、XML、图像等等)、整理讯息(例如加入CSS等),以及计算网页的显示方式,然后会输出至显示器或打印机。浏览器的内核的不同对于网页的语法解释会有不同,所以渲染的效果也不相同。所有网页浏览器、电子邮件客户端以及其它需要编辑、显示网络内容的应用程序都需要内核。

    JS引擎则:解析和执行javascript来实现网页的动态效果。

    最开始渲染引擎和JS引擎并没有区分的很明确,后来JS引擎越来越独立,内核就倾向于只指渲染引擎。

  6. 常见的浏览器内核有哪些?

    Trident内核:IE,MaxThon,TT,The World,360,搜狗浏览器等。[又称MSHTML] Gecko内核:Netscape6及以上版本,FF,MozillaSuite/SeaMonkey等 Presto内核:Opera7及以上。 [Opera内核原为:Presto,现为:Blink;] Webkit内核:Safari,Chrome等。 [ Chrome的:Blink(WebKit的分支)]

  7. html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和HTML5?

    HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加。

    绘画 canvas; 用于媒介回放的 videoaudio 元素; 本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失; sessionStorage 的数据在浏览器关闭后自动删除; 语意化更好的内容元素,比如 articlefooterheadernavsection; 表单控件,calendardatetimeemailurlsearch; 新的技术webworker, websocket, Geolocation;

    移除的元素:

    纯表现的元素:basefont,big,center,font, s,strike,tt,u; 对可用性产生负面影响的元素:frame,frameset,noframes;

    支持HTML5新标签:

    IE8/IE7/IE6支持通过document.createElement方法产生的标签, 可以利用这一特性让这些浏览器支持HTML5新标签, 浏览器支持新标签后,还需要添加标签默认的样式。

    当然也可以直接使用成熟的框架、比如html5shim;

     ```html
          <!--[if lt IE 9]>
         	<script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script>
          <![endif]-->
      ```  如何区分HTML5: DOCTYPE声明\新增的结构元素\功能元素
    
  8. 简述一下你对HTML语义化的理解?

    用正确的标签做正确的事情。 html语义化让页面的内容结构化,结构更清晰,便于对浏览器、搜索引擎解析; 即使在没有样式CSS情况下也以一种文档格式显示,并且是容易阅读的; 搜索引擎的爬虫也依赖于HTML标记来确定上下文和各个关键字的权重,利于SEO; 使阅读源代码的人对网站更容易将网站分块,便于阅读维护理解。

  9. HTML5的离线储存怎么使用,工作原理能不能解释一下?

    在用户没有与因特网连接时,可以正常访问站点或应用,在用户与因特网连接时,更新用户机器上的缓存文件。 原理:HTML5的离线存储是基于一个新建的.appcache文件的缓存机制(不是存储技术),通过这个文件上的解析清单离线存储资源,这些资源就会像cookie一样被存储了下来。之后当网络在处于离线状态下时,浏览器会通过被离线存储的数据进行页面展示。

    如何使用

    在你的页面头部像下面一样加入一个manifest的属性就可以了

     <!DOCTYPE HTML>
     <html manifest = "cache.manifest">
     ...
     </html>
    

    然后cache.manifest文件的书写方式,就像下面这样:

     CACHE MANIFEST
     #v0.11
        
     CACHE:
     js/app.js
     css/style.css
        
     NETWORK:
     resourse/logo.png
        
     FALLBACK:
     / /offline.html
    

    1.CACHE:表示需要离线存储的资源列表,由于包含manifest文件的页面将被自动离线存储,所以不需要把页面自身也列出来。 2.NETWORK:表示在它下面列出来的资源只有在在线的情况下才能访问,他们不会被离线存储,所以在离线情况下无法使用这些资源。不过,如果在CACHE和NETWORK中有一个相同的资源,那么这个资源还是会被离线存储,也就是说CACHE的优先级更高。 3.FALLBACK:表示如果访问第一个资源失败,那么就使用第二个资源来替换他,比如上面这个文件表示的就是如果访问根目录下任何一个资源失败了,那么就去访问offline.html。

  10. 浏览器是怎么对HTML5的离线储存资源进行管理和加载的呢?

    在线的情况下,浏览器发现html头部有manifest属性,它会请求manifest文件,如果是第一次访问app,那么浏览器就会根据manifest文件的内容下载相应的资源并且进行离线存储。如果已经访问过app并且资源已经离线存储了,那么浏览器就会使用离线的资源加载页面,然后浏览器会对比新的manifest文件与旧的manifest文件,如果文件没有发生改变,就不做任何操作,如果文件改变了,那么就会重新下载文件中的资源并进行离线存储。

    离线的情况下,浏览器就直接使用离线存储的资源。

  11. 请描述一下 cookies,sessionStorage 和 localStorage 的区别?

    cookie是网站为了标示用户身份而储存在用户本地终端(ClientSide)上的数据(通常经过加密)。 cookie数据始终在同源的http请求中携带(即使不需要),记会在浏览器和服务器间来回传递。

    sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存。

    存储大小:

    cookie数据大小不能超过4k。 sessionStorage和localStorage虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大。

    有期时间:

    localStorage 存储持久数据,浏览器关闭后数据不丢失除非主动删除数据; sessionStorage 数据在当前浏览器窗口关闭后自动删除。 cookie 设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭

  12. iframe有那些缺点?

    iframe会阻塞主页面的Onload事件; 搜索引擎的检索程序无法解读这种页面,不利于SEO; iframe和主页面共享连接池,而浏览器对相同域的连接有限制,所以会影响页面的并行加载。

    使用iframe之前需要考虑这两个缺点。如果需要使用iframe,最好是通过javascript动态给iframe添加src属性值,这样可以绕开以上两个问题。

  13. Label的作用是什么?是怎么用的?

    label标签来定义表单控制间的关系,当用户选择该标签时,浏览器会自动将焦点转到和标签相关的表单控件上。

    <label for="Name">Number:</label>
    <input type=“text“name="Name" id="Name"/>
    <label>Date:<input type="text" name="B"/></label>
    
  14. HTML5的form如何关闭自动完成功能?

    给不想要提示的 form 或某个 input 设置为 autocomplete=off。

  15. 如何实现浏览器内多个标签页之间的通信? (阿里)

    WebSocket、SharedWorker;

    也可以调用localstorge、cookies等本地存储方式;

    localstorge另一个浏览上下文里被添加、修改或删除时,它都会触发一个事件, 我们通过监听事件,控制它的值来进行页面信息通信; 注意quirks:Safari 在无痕模式下设置localstorge值时会抛出 QuotaExceededError 的异常

  16. webSocket如何兼容低浏览器?(阿里)

    Adobe Flash Socket 、 ActiveX HTMLFile (IE) 、 基于 multipart 编码发送 XHR 、 基于长轮询的 XHR

  17. 页面可见性(Page Visibility API) 可以有哪些用途?

    通过 visibilityState 的值检测页面当前是否可见,以及打开网页的时间等; 在页面被切换到其他后台进程的时候,自动暂停音乐或视频的播放

  18. 如何在页面上实现一个圆形的可点击区域?

    1、map+area或者svg 2、border-radius 3、纯js实现 需要求一个点在不在圆上简单算法、获取鼠标坐标等等

  19. 实现不使用 border 画出1px高的线,在不同浏览器的标准模式与怪异模式下都能保持一致的效果。

    <div style="height:1px;overflow:hidden;background:red"></div>
    
  20. 网页验证码是干嘛的,是为了解决什么安全问题。

    区分用户是计算机还是人的公共全自动程序。可以防止恶意破解密码、刷票、论坛灌水; 有效防止黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。

  21. title与h1的区别、b与strong的区别、i与em的区别?

    title属性没有明确意义只表示是个标题,H1则表示层次明确的标题,对页面信息的抓取也有很大的影响;

    strong是标明重点内容,有语气加强的含义,使用阅读设备阅读网络时:< strong>会重读,而< b>是展示强调内容。

    i内容展示为斜体,em表示强调的文本;

    自然样式标签:

    b, i, u, s, pre

    语义样式标签

    strong, em, ins, del, code

    应该准确使用语义样式标签, 但不能滥用, 如果不能确定时首选使用自然样式标签

  22. 介绍一下标准的CSS的盒子模型?低版本IE的盒子模型有什么不同的?

    有两种, IE 盒子模型、W3C 盒子模型; 盒模型: 内容(content)、填充(padding)、边界(margin)、 边框(border);

    区 别:

    IE的content部分把 border 和 padding计算了进去;

  23. CSS选择符有哪些?哪些属性可以继承?

    1. id选择器( # myid)
    2. 类选择器(.myclassname)
    3. 标签选择器(div, h1, p)
    4. 相邻选择器(h1 + p)
    5. 子选择器(ul > li)
    6. 后代选择器(li a)
    7. 通配符选择器( * )
    8. 属性选择器(a[rel = "external"])
    9. 伪类选择器(a:hover, li:nth-child)
    

    可继承的样式: font-size font-family color, UL LI DL DD DT; 不可继承的样式:border padding margin width height ;

  24. CSS优先级算法如何计算?

    优先级就近原则,同权重情况下样式定义最近者为准; 载入样式以最后载入的定位为准;

    优先级为:

    !important > id > class > tag important 比 内联优先级高

  25. CSS3新增伪类有那些?

    p:first-of-type 选择属于其父元素的首个 < p> 元素的每个 < p> 元素。 p:last-of-type 选择属于其父元素的最后 < p> 元素的每个 < p> 元素。 p:only-of-type 选择属于其父元素唯一的 < p> 元素的每个 < p> 元素。 p:only-child 选择属于其父元素的唯一子元素的每个 < p> 元素。 p:nth-child(2) 选择属于其父元素的第二个子元素的每个 < p> 元素。 :after 在元素之前添加内容,也可以用来做清除浮动。 :before 在元素之后添加内容 :enabled :disabled 控制表单控件的禁用状态。 :checked 单选框或复选框被选中

  26. 如何居中div?如何居中一个浮动元素?如何让绝对定位的div居中?

    给div设置一个宽度,然后添加margin:0 auto属性

    居中一个浮动元素:先定位,再利用margin设置

    .div {
    	  width:500px ; height:300px;//高度可以不设
    	  margin: -150px 0 0 -250px;
    	  position:relative;		 //相对定位
          background-color:pink;	 //方便看效果
    	  left:50%;
    	  top:50%;
     }
    

    让绝对定位的div居中:四个方向都设置为0

    div{
         position: absolute;
          width: 1200px;
          background: none;
          margin: 0 auto;
          top: 0;
          left: 0;
          bottom: 0;
          right: 0;
    }
    
  27. display有哪些值?说明他们的作用。

    block 象块类型元素一样显示。 none 缺省值。象行内元素类型一样显示。 inline-block 象行内元素一样显示,但其内容象块类型元素一样显示。 list-item 象块类型元素一样显示,并添加样式列表标记。 table 此元素会作为块级表格来显示 inherit 规定应该从父元素继承 display 属性的值

  28. position的值relative和absolute定位原点是?

    absolute 生成绝对定位的元素,相对于值不为 static的第一个父元素进行定位。 fixed (老IE不支持) 生成绝对定位的元素,相对于浏览器窗口进行定位。 relative 生成相对定位的元素,相对于其正常位置进行定位。 static 默认值。没有定位,元素出现在正常的流中(忽略 top, bottom, left, right z-index 声明)。 inherit 规定从父元素继承 position 属性的值。

  29. CSS3有哪些新特性?

    新增各种CSS选择器 (: not(.input):所有 class 不是“input”的节点) 圆角 (border-radius:8px) 多列布局 (multi-column layout) 阴影和反射 (Shadow\Reflect) 文字特效 (text-shadow、) 文字渲染 (Text-decoration) 线性渐变 (gradient) 旋转 (transform) 增加了旋转,缩放,定位,倾斜,动画,多背景 transform:\scale(0.85,0.90)\ translate(0px,-30px)\ skew(-9deg,0deg)\Animation:

  30. 经常遇到的浏览器的兼容性有哪些?原因,解决方法是什么,常用hack的技巧 ?

    png24位的图片在iE6浏览器上出现背景,解决方案是做成PNG8.

    浏览器默认的margin和padding不同。解决方案是加一个全局的*{margin:0;padding:0;}来统一。

    IE6双边距bug:块属性标签float后,又有横行的margin情况下,在ie6显示margin比设置的大。 浮动ie产生的双倍距离 #box{ float:left; width:10px; margin:0 0 0 100px;} 这种情况之下IE会产生20px的距离,解决方案是在float的标签样式控制中加入——_display:inline;将其转化为行内属性。(_这个符号只有ie6会识别)

    IE下,可以使用获取常规属性的方法来获取自定义属性, 也可以使用getAttribute()获取自定义属性; Firefox下,只能使用getAttribute()获取自定义属性。 解决方法:统一通过getAttribute()获取自定义属性。

    IE下,even对象有x,y属性,但是没有pageX,pageY属性; Firefox下,event对象有pageX,pageY属性,但是没有x,y属性。 解决方法:(条件注释)缺点是在IE浏览器下可能会增加额外的HTTP请求数。

    Chrome 中文界面下默认会将小于 12px 的文本强制按照 12px 显示, 可通过加入 CSS 属性 -webkit-text-size-adjust: none; 解决。

    超链接访问过后hover样式就不出现了被点击访问过的超链接样式不在具有hover和active了解决方法是改变CSS属性的排列顺序:L-V-H-A

  31. li与li之间有看不见的空白间隔是什么原因引起的?有什么解决办法?

    行框的排列会受到中间空白(回车\空格)等的影响,因为空格也属于字符,这些空白也会被应用样式,占据空间,所以会有间隔,把字符大小设为0,就没有空格了

  32. 为什么要初始化CSS样式。

    因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面显示差异。 当然,初始化样式会对SEO有一定的影响,但鱼和熊掌不可兼得,但力求影响最小的情况下初始化

    淘宝的样式初始化代码:

    body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fieldset, legend, button, input, textarea, th, td { margin:0; padding:0; }
        
    body, button, input, select, textarea { font:12px/1.5tahoma, arial, \5b8b\4f53; }
    	
    h1, h2, h3, h4, h5, h6{ font-size:100%; }
    	
    address, cite, dfn, em, var { font-style:normal; }
    	
    code, kbd, pre, samp { font-family:couriernew, courier, monospace; }
    	
    small{ font-size:12px; }
    	
    ul, ol { list-style:none; }
    	
    a { text-decoration:none; }
    	
    a:hover { text-decoration:underline; }
    	
    sup { vertical-align:text-top; }
    	
    sub{ vertical-align:text-bottom; }
    	
    legend { color:#000; }
    	
    fieldset, img { border:0; }
    	
    button, input, select, textarea { font-size:100%; }
    	
    table { border-collapse:collapse; border-spacing:0; }
    
  33. absolute的containing block(容器块)计算方式跟正常流有什么不同?

    无论属于哪种,都要先找到其祖先元素中最近的 position 值不为 static 的元素,然后再判断:

    1. static(默认的)/relative:简单说就是它的父元素的内容框(即去掉padding的部分)
    2. absolute: 向上找最近的定位为absolute/relative的元素
    3. fixed: 它的containing block一律为根元素(html/body),根元素也是initial containing block
  34. CSS里的visibility属性有个collapse属性值是干嘛用的?在不同浏览器下以后什么区别?

    当在表格元素中使用时,此值可删除一行或一列,但是它不会影响表格的布局。被行或列占据的空间会留给其他内容使用。如果此值被用在其他的元素上,会呈现为 “hidden”。

  35. 对BFC规范(块级格式化上下文:block formatting context)的理解?

    (W3C CSS 2.1 规范中的一个概念,它是一个独立容器,决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用。)

    一个页面是由很多个 Box 组成的,元素的类型和 display 属性,决定了这个 Box 的类型。 不同类型的 Box,会参与不同的 FormattingContext(决定如何渲染文档的容器),因此Box内的元素会以不同的方式渲染,也就是说BFC内部的元素和外部的元素不会互相影响。

  36. css定义的权重

    以下是权重的规则:标签的权重为1,class的权重为10,id的权重为100,以下例子是演示各种定义的权重值: 如果权重相同,则最后定义的样式会起作用,但是应该避免这种情况出现

  37. 浏览器是怎样解析CSS选择器的?

    样式系统从关键选择器开始匹配,然后左移查找规则选择器的祖先元素。 只要选择器的子树一直在工作,样式系统就会持续左移,直到和规则匹配,或者是因为不匹配而放弃该规则。

  38. margin和padding分别适合什么场景使用?

    margin是用来隔开元素与元素的间距;padding是用来隔开元素与内容的间隔。 margin用于布局分开元素使元素与元素互不相干; padding用于元素与内容之间的间隔,让内容(文字)与(包裹)元素之间有一段

  39. 如何修改chrome记住密码后自动填充表单的黄色背景 ?

    input:-webkit-autofill, textarea:-webkit-autofill, select:-webkit-autofill {
      background-color: rgb(250, 255, 189); /* #FAFFBD; */
      background-image: none;
      color: rgb(0, 0, 0);
    }
    
  40. 设置元素浮动后,该元素的display值是多少?(自动变成display:block)

  41. 让页面里的字体变清晰,变细用CSS怎么做?(-webkit-font-smoothing: antialiased;)

  42. font-style属性可以让它赋值为“oblique” oblique是什么意思?

    倾斜的字体样式

  43. position:fixed;在android下无效怎么处理?

    fixed的元素是相对整个页面固定位置的,你在屏幕上滑动只是在移动这个所谓的viewport,原来的网页还好好的在那,fixed的内容也没有变过位置,所以说并不是iOS不支持fixed,只是fixed的元素不是相对手机屏幕固定的。

    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/>
    
  44. 如果需要手动写动画,你认为最小时间间隔是多久,为什么?(阿里)

    多数显示器默认频率是60Hz,即1秒刷新60次,所以理论上最小间隔为1/60*1000ms = 16.7ms

  45. display:inline-block 什么时候会显示间隙?(携程)

移除空格、使用margin负值、使用font-size:0、letter-spacing、word-spacing

  1. 有一个高度自适应的div,里面有两个div,一个高度100px,希望另一个填满剩下的高度。

    <div class="box">
        <div class="el1"></div>
        <div class="el2"></div>
    </div>
    

    第一种方法:flex

    .box {width:200px;height:300px;background:red;display:flex;flex-direction:column;}
    .el1 {height:100px;background:green;}
    .el2 {background:blue;flex:1}
    

    第二种方法:position

    .box {width:200px;height:300px;background:red;position:relative;}
    .el1 {height:100px;background:green;}
    .el2 {background:blue;width:200px;position:absolute;top:100px;bottom:0;}
    
  2. 什么是Cookie 隔离?(或者说:请求资源的时候不要让它带cookie怎么做)

    如果静态文件都放在主域名下,那静态文件请求的时候都带有的cookie的数据提交给server的,非常浪费流量,所以不如隔离开。 因为cookie有域的限制,因此不能跨域提交请求,故使用非主要域名的时候,请求头中就不会带有cookie数据,这样可以降低请求头的大小,降低请求时间,从而达到降低整体请求延时的目的。 同时这种方式不会将cookie传入Web Server,也减少了Web Server对cookie的处理分析环节,提高了webserver的http请求的解析速度。

  3. 什么是CSS 预处理器 / 后处理器

    预处理器例如:LESS、Sass、Stylus,用来预编译Sass或less,增强了css代码的复用性,还有层级、mixin、变量、循环、函数等,具有很方便的UI组件模块化开发能力,极大的提高工作效率。 后处理器例如:PostCSS,通常被视为在完成的样式表中根据CSS规范处理CSS,让其更有效;目前最常做的,是给CSS属性添加浏览器私有前缀,实现跨浏览器兼容性的问题。

  4. 介绍js的基本数据类型。

    Undefined、Null、Boolean、Number、String

  5. 介绍js有哪些内置对象?

    Object 是 JavaScript 中所有对象的父对象 数据封装类对象:Object、Array、Boolean、Number 和 String 其他对象:Function、Arguments、Math、Date、RegExp、Error

  6. 说几条写JavaScript的基本规范?

    1.不要在同一行声明多个变量。 2.请使用 ===/!==来比较true/false或者数值 3.使用对象字面量替代new Array这种形式 4.不要使用全局函数。 5.Switch语句必须带有default分支 6.函数不应该有时候有返回值,有时候没有返回值。 7.For循环必须使用大括号 8.If语句必须使用大括号 9.for-in循环中的变量 应该使用var关键字明确限定作用域,从而避免作用域污染。

  7. JavaScript原型,原型链 ? 有什么特点?

    每个对象都会在其内部初始化一个属性,就是prototype(原型),当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去prototype里找这个属性,这个prototype又会有自己的prototype,于是就这样一直找下去,也就是我们平时所说的原型链的概念。

    关系:instance.constructor.prototype = instance.__proto__

    特点:

    JavaScript对象是通过引用来传递的,我们创建的每个新对象实体中并没有一份属于自己的原型副本。当我们修改原型时,与之相关的对象也会继承这一改变。

    当我们需要一个属性的时,Javascript引擎会先看当前对象中是否有这个属性, 如果没有的话,就会查找他的Prototype对象是否有这个属性,如此递推下去,一直检索到 Object 内建对象。

  8. JavaScript有几种类型的值?,你能画一下他们的内存图吗?

    栈:原始数据类型(Undefined,Null,Boolean,Number、String)

    堆:引用数据类型(对象、数组和函数)

    两种类型的区别是:存储位置不同;

    原始数据类型直接存储在栈(stack)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储;

    引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定,如果存储在栈中,将会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其

    在栈中的地址,取得地址后从堆中获得实体

  9. Javascript如何实现继承?

    1、构造继承 2、原型继承 3、实例继承 4、拷贝继承

  10. 构造函数的继承

    构造函数绑定:使用call或apply方法,将父对象的构造函数绑定在子对象上

    function Animal(){
        this.species = "动物";
      }
      
      function Cat(name,color){
        this.name = name;
        this.color = color;
      }
      // Cat函数写法如下即可实现继承
      function Cat(name,color){
        Animal.apply(this, arguments);
        this.name = name;
        this.color = color;
      }
      
      var cat1 = new Cat("大毛","黄色");
      alert(cat1.species); // 动物
    

    拷贝继承: 就是将父对象的prototype对象中的属性,一一拷贝给Child对象的prototype对象。

    function Animal(){
            
    }
      Animal.prototype.species = "动物";
      
      function extend2(Child, Parent) {
        var p = Parent.prototype;
        var c = Child.prototype;
        for (var i in p) {
          c[i] = p[i];
          }
        c.uber = p;
      }
      
      extend2(Cat, Animal);
      var cat1 = new Cat("大毛","黄色");
      alert(cat1.species); // 动物
    

    构造函数与原型混合方式

    function Parent(){
        this.name = 'wang';
    }
    
    function Child(){
        this.age = 28;
    }
    Child.prototype = new Parent();//继承了Parent,通过原型
    
    var demo = new Child();
    alert(demo.age);
    alert(demo.name); //得到被继承的属性
    
  11. Javascript作用链域?

    全局函数无法查看局部函数的内部细节,但局部函数可以查看其上层的函数细节,直至全局细节。当需要从局部函数查找某一属性或方法时,如果当前作用域没有找到,就会上溯到上层作用域查找,直至全局函数,这种组织形式就是作用域链。

  12. 谈谈This对象的理解。

    this总是指向函数的直接调用者(而非间接调用者); 如果有new关键字,this指向new出来的那个对象 在事件中,this指向触发这个事件的对象,特殊的是,IE中的attachEvent中的this总是指向全局对象Window;

  13. eval是做什么的?

    它的功能是把对应的字符串解析成JS代码并运行; 应该避免使用eval,不安全,非常耗性能(2次,一次解析成js语句,一次执行)。 由JSON字符串转换为JSON对象的时候可以用eval,var obj =eval(‘(‘+ str +’)’);

  14. null,undefined 的区别?

    null 表示一个对象被定义了,值为“空值”; undefined 表示不存在这个值。

    typeof undefined //”undefined” undefined :是一个表示”无”的原始值或者说表示”缺少值”,就是此处应该有一个值,但是还没有定义。当尝试读取时会返回 undefined; 例如变量被声明了,但没有赋值时,就等于undefined

    typeof null //”object” null : 是一个对象(空对象, 没有任何属性和方法); 例如作为函数的参数,表示该函数的参数不是对象;

    在验证null时,一定要使用 === ,因为 == 无法分别 null 和 undefined

    null

    Q:有张三这个人么? A:有! Q:张三有房子么? A:没有!

    undefined

    Q:有张三这个人么? A:没有!

  15. 写一个通用的事件侦听器函数。

    var EventUtil ={  
        // 得到事件  
        getEvent:function(event){  
            return event?event:window.event;  
        },  
            
        //添加事件  
        addEvent:function(element,type,handler){  
            //DOM2级事件处理程序,false表示在冒泡阶段处理事件程序  
            if(element.addEventListener){  
                element.addEventListener(type,handler,true);  
            }  
            //IE事件处理程序  
            else if(element.attachEvent){  
                element.attachEvent("on"+type,handler);  
            }  
            //DOM0级  
            else{  
                element["on"+type]=handler;  
            }  
        },  
            
        //移除事件  
        removeEvent:function(element,type,handler){  
            if(element.removeEventListener){  
                element.removeEventListener(type,handler);  
            }else if(element.detachEvent){  
                element.detachEvent("on"+type,handler);  
            }else{  
                element["on"+$.type] = null;  
            }  
        },  
            
        //阻止事件默认行为  
        preventDefault:function(event){  
            if(event.preventDefault){  
                event.preventDefault;  
            }else{  
                event.returnValue = false;  
            }  
        }, 
            
        //阻止事件冒泡和捕获  
        stopPropagation:function(event){  
            if(event.stopPropagation){  
                event.stopPropagation();  
            }else{  
                event.cancelBubble = true;  
            }  
        },  
            
        //得到事件的目标  
        getTarget:function(event){  
            return event.target||event.srcElement;  
        }  
    }
    
  16. [“1”, “2”, “3”].map(parseInt) 答案是多少?

    [1, NaN, NaN] 因为 parseInt 需要两个参数 (val, radix),

    [0]=parseInt(“1”,0); //1100=11=1 [1]=parseInt(“2”,1); //radix不在2~36的返回NaN [2]=parseInt(“3”,2); //二进制数没有3,只有0 1 ,所以NaN

  17. 事件是?IE与火狐的事件机制有什么区别? 如何阻止冒泡?

    1. 我们在网页中的某个操作(有的操作对应多个事件)。例如:当我们点击一个按钮就会产生一个事件。是可以被 JavaScript 侦测到的行为。
    2. 事件处理机制:IE是事件冒泡、Firefox同时支持两种事件模型,也就是:捕获型事件和冒泡型事件;
    3. ev.stopPropagation();(旧ie的方法 ev.cancelBubble = true;)
  18. 什么是闭包(closure),为什么要用它?

    闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域,将函数内部的变量和方法传递到外部。

    闭包的特性:

    1.函数内再嵌套函数 2.内部函数可以引用外层的参数和变量 3.参数和变量不会被垃圾回收机制回收

     function say667() {
        // Local variable that ends up within closure
        var num = 666;
        var sayAlert = function() {
            alert(num);
        }
        num++;
        return sayAlert;
    }
    
     var sayAlert = say667();
     sayAlert()//执行结果应该弹出的667
    

    执行say667()后,say667()闭包内部变量会存在,而闭包内部函数的内部变量不会存在,使得Javascript的垃圾回收机制GC不会收回say667()所占用的资源,因为say667()的内部函数的执行需要依赖say667()中的变量,这是对闭包作用的非常直白的描述

  19. javascript 代码中的”use strict”;是什么意思 ? 使用它区别是什么?

    use strict是一种ECMAscript 5 添加的(严格)运行模式,这种模式使得 Javascript 在更严格的条件下运行,

    使JS编码更加规范化的模式,消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为。 默认支持的糟糕特性都会被禁用,比如不能用with,也不能在意外的情况下给全局变量赋值; 全局变量的显示声明,函数必须声明在顶层,不允许在非函数代码块内声明函数,arguments.callee也不允许使用; 消除代码运行的一些不安全之处,保证代码运行的安全,限制函数中的arguments修改,严格模式下的eval函数的行为和非严格模式的也不相同;

    提高编译器效率,增加运行速度; 为未来新版本的Javascript标准化做铺垫。

  20. 如何判断一个对象是否属于某个类?

    if(a instanceof Person){
       alert('yes');
       }
    
  21. new操作符具体干了什么呢?

    1. 会在构造函数的内部创建一个空对象
    2. 把函数内部的this指向刚创建的空对象
    3. 执行函数,添加属性
    4. 函数结尾返回对象
  22. Javascript中,有一个函数,执行时对象查找时,永远不会去查找原型,这个函数是?

    hasOwnProperty

    javaScript中hasOwnProperty函数方法是返回一个布尔值,指出一个对象是否具有指定名称的属性。此方法无法检查该对象的原型链中是否具有该属性;该属性必须是对象本身的一个成员

    proName是必选项。一个属性名称的字符串值。

  23. JSON

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 它是基于JavaScript的一个子集。数据格式简单, 易于读写, 占用带宽小

    JSON字符串转换为JSON对象:

    var obj =eval(‘(‘+ str +’)’); var obj = str.parseJSON(); var obj = JSON.parse(str);

    JSON对象转换为JSON字符串:

    var last=obj.toJSONString(); var last=JSON.stringify(obj);

  24. 特殊运行题

    [].forEach.call($$("*"),function(a){ a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16) }) 
        
    // $$('*') 表示document.querySelectorAll('') 选中页面中所有的元素
    // ~~类似于|0 表示parseInt()
    // 1<<24 表示1*2^24   3<<5 表示 3*2^5
    // (~~(Math.random()*(1<<24))).toString(16) 定义随机颜色
    
  25. js延迟加载的方式有哪些?

    defer和async、动态创建DOM方式(用得最多)、按需异步载入js

  26. Ajax 是什么? 如何创建一个Ajax?

    ajax的全称:Asynchronous Javascript And XML。 异步传输+js+xml。 所谓异步,在这里简单地解释就是:向服务器发送请求的时候,我们不必等待结果,而是可以同时做其他的事情,等到有了结果它自己会根据设定进行后续操作,与此同时,页面是不会发生整页刷新的,提高了用户体验。

    如何创建一个Ajax

    (1)创建XMLHttpRequest对象,也就是创建一个异步调用对象 (2)创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息 (3)设置响应HTTP请求状态变化的函数 (4)发送HTTP请求 (5)获取异步调用返回的数据 (6)使用JavaScript和DOM实现局部刷新

  27. 同步和异步的区别?

    同步的概念应该是来自于OS中关于同步的概念:不同进程为协同完成某项工作而在先后次序上调整(通过阻塞,唤醒等方式).同步强调的是顺序性.谁先谁后.异步则不存在这种顺序性.

    同步:浏览器访问服务器请求,用户看得到页面刷新,重新发请求,等请求完,页面刷新,新内容出现,用户看到新内容,进行下一步操作。

    异步:浏览器访问服务器请求,用户正常操作,浏览器后端进行请求。等请求完,页面不刷新,新内容也会出现,用户看到新内容。

  28. 如何解决跨域问题?

    jsonp、 iframe、window.name、window.postMessage、服务器上设置代理页面

  29. 模块化开发怎么做

    var module1 = (function(){
        var _count = 0;
        var m1 = function(){
          //...
        };
        var m2 = function(){
          //...
        };
        return {
          m1 : m1,
          m2 : m2
        };
      })()
    
  30. AMD和CMD规范区别?

    AMD 是提前执行,CMD 是延迟执行 CMD 推崇依赖就近,AMD 推崇依赖前置。

    CMD相当于按需加载,定义一个模块的时候不需要立即制定依赖模块,在需要的时候require就可以了,比较方便;而AMD则相反,定义模块的时候需要制定依赖模块,并以形参的方式引入factory中

  31. requireJS的核心原理是什么?(如何动态加载的?如何避免多次加载的?如何 缓存的?)

    关于requirejs的介绍

  32. 前端面试问题集锦

  33. 作用域链,原型链的问题