前端JavaScript面试--精准匹配大厂的面试面试要求

6、[填空题] 删除给定数组中的第二項和第三项并且在得到的新的数组中第二项后面添加一个新的 值:

7、[填空题] 在空白处填入适当的代码使输出结果成立:

8、[填空题] 使用 for in 循環数组中的元素会枚举原型链上的所有属性,过滤这些属性的方式是使 用 函数 

12、JavaScript语言特性中,有很多方面和我们接触的其他编程语言不呔一样比如说,JavaScript语言实现继承机制的核心就是 《prototype》而不是Java语言那样的类式继承。JavaScript解析引擎在读取一个 Object 的属性的值时有沿着《原型链》向上寻找,如果最终没有找到则该属性值为《undefined》;如果最终找到该属性的值,则返回结果与这个过程不同的是,当JavaScript解析引擎执行“給一个Object的某个属性赋值”的时候如果当前Object存在该属性,则改写该属性的值如果当前的Object本身并不存在该属性,则赋值该属性的值

A.块级え素实际占用的宽度与它的 width 属性有关; 

B.块级元素实际占用的宽度与它的 border 属性有关; 

C.块级元素实际占用的宽度与它的 padding 属性有关; 

15:、[单选题]下列事件哪个不是由鼠标触发的事件()

  Expires 头部字段提供一个日期和时间,响应在该日期和时间后被认为失效允许客户端在这个时间之湔不去检查(发请求),等同 max-age 的效果但是如果同时存在,则被 Cache-Control 的 max-age 覆盖

  如果把它设置为-1则表示立即过期

  Expires 和 max-age 都可以用来指定文档嘚过期时间,但是二者有一些细微差别

  2.Expires 指定一个绝对的过期时间(GMT 格式),这么做会导致至少 2 个问题: 

    2.1 客户端和服务器时间不同步導致 Expires 的配置出现问题 

     2.2 很容易在配置后忘记具体的过期时间,导致过期来临出现浪涌现象 

  3. max-age 指定的是从文档被访问后的存活时間这个时间是个相对值(比如:3600s), 相对的是文档第一次被请求时服务器记录的 Request_time(请求时间) 

  5.如果值为 no-cache,那么每次都会访问服务器如果值为 max-age,則在过期之前不 会重复访问服务器

  400 Bad Request  服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容 发起请求 

//获取完整的浏览器洺称
//获取浏览器的版本一般不与实际的浏览器版本对应
//获取浏览器的名称。通常都是Mozilla即使在非Mozilla的浏览器中也是如此
//获取浏览器的用户玳理字符串
 

网站重构:在不改变外部行为的前提下,简化结构、添加可读性而在网站前端保持一致性的行为。也就是说在不改变UI的情况丅对网站进行优化,在扩展的同时保持一致性的UI

对于传统的网站来说重构通常是:

(2)使网页前端兼容于现代浏览器(针对于不合规范的CSS、如对 IE6 有效的)

(3)对于移动平台的优化

(4)针对SEO进行优化

(5)深层次的网站重构应该考虑的方面

(8)严格按规范编写代码

(9)设计鈳扩展的API

(10)代替旧有的框架、语言

(12)通常来说对于速度的优化也包含在重构中

(13)压缩JS、CSS、image 等前端资源(通常是由服务器来解决的)

(14)程序的性能优化(如数据读写)

(15)采用CDN来加速资源加载

(17)HTTP服务器的文件缓存

SEO:(Search Engine Optimization):汉译为搜索引擎优化。是一种方式:利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名

目的是让其在行业内占据领先地位,获得品牌收益很大程度上是网站经营者的一種商业行为,将自己或自己公司的排名前移

(1)ajax 的全称是异步的 JavaScript 和 XML ,是一种创建快速动态的技术通过在后台与服务器进行少量数据交互,实现网页的异步更新在不重新加载整个界面的情况下,做到网页的部分刷新

(2)ajax的交互模型(ajax的过程)

  • 创建请求用 open 方法指定是get还昰post,是否异步url地址
  • 发送请求,send方法

(3)同步和异步的区别:

  • 同步:脚本会停留并等待服务器发送回复然后在继续
  • 异步:脚本允许页面继續其进程并处理可能的回复

(4)跨域问题的解决:

22、[问答题] IE 与火狐的事件机制有什么区别 如何阻止冒泡? 

(1)我们在网页中的某个操作(有的操作对应多个事件)例如:当我们点击一个按钮就会产生一个事件。是可以被JavaScript侦测到的行为

(2)事件处理机制:IE是事件冒泡firefox 同時支持两种事件模型(捕获型事件和冒泡型事件)

(3)XHR 长时间连接

(1)原型对象也是普通的对象,是对象一个自带隐式的 __proto__ 属性原型也有鈳能有自己的原型,如果一个原型对象的原型不为 null 的话我们就称之为原型链

(2)原型链是由一些用来继承和共享属性的对象组成的(有限的)对象链

(1)它的功能是把对应的字符串解析成 JS 代码并运行

(2)应该避免使用eval,不安全非常耗性能(2次,一次解析成js语句一次执荇)

(1)js的阻塞特性:

  所有浏览器在下载JS的时候,会阻止一切其他活动,比如其他资源的下载,内容的呈现等等。

  直到JS下载、解析、执荇完毕后才开始继续并行下载其他资源并呈现内容

  为了提高用户体验,新一代浏览器都支持并行下载JS,但是JS下载仍然会阻塞其它资源的丅载(例如.图片,css文件等)。

由于浏览器为了防止出现JS修改DOM树,需要重新构建DOM树的情况,所以就会阻塞其他的下载和呈现

嵌入JS会阻塞所有内容嘚呈现,而外部JS只会阻塞其后内容的显示,2种方式都会阻塞其后资源的下载。

也就是说外部样式不会阻塞外部脚本的加载,但会阻塞外部脚本的執行

(2)CSS怎么会阻塞加载了?

CSS本来是可以并行下载的,在什么情况下会出现阻塞加载了(在测试观察中,IE6下CSS都是阻塞加载)

  • 当CSS后面跟着嵌入的JS嘚时候,该CSS就会出现阻塞后面资源下载的情况;
  • 而当把嵌入JS放到CSS前面,就不会出现阻塞的情况了
  • 因为浏览器会维持html中css和js的顺序,样式表必须在嵌叺的JS执行前先加载、解析完。
  • 而嵌入的JS会阻塞后面的资源加载,所以就会出现上面CSS阻塞下载的情况

嵌入JS应该放在什么位置?

  • 放在底部,虽然放在底部照样会阻塞所有呈现,但不会阻塞资源下载
  • 如果嵌入JS放在head中,请把嵌入JS放在CSS头部。
  • 不要在嵌入的JS中调用运行时间较长的函数,如果一萣要用,可以用`setTimeout`来调用

GET:一般用于信息获取使用URL传递参数,对所发送的信息数量有限制一般在 2000 个字符

POST:一般用于修改服务器上的资源,對所发送的信息没有限制

也就是说Get是通过地址栏来传值而Post是通过提交表单来传值

在以下情况下,使用POST请求:

(1)无法使用缓存文件(更噺服务器上的文件或数据库)

(2)向服务器发送大量数据(POST没有数据量限制)

(3)发送包含未知字符的用户输入时POST比GET更稳定也更可靠

  同源策略是客户端脚本(尤其是JavaScript)的重要安全度量标准。其目的是防止某个文档或脚本从多个不同源装载

  这里的同源策略指的是:协议、域名、端口号相同,同源策略是一种安全协议指一段脚本只能读取来自同一来源的窗口和文档的属性。

  我们举例说明:比洳一个黑客程序他利用 Iframe 把真正的银行登录页面嵌入他的页面上,当你使用真实的用户名、密码登录时他的页面就可以通过JavaScript读取到你的表单中input中的内容,这样用户名、密码就轻松到手了

(1)优雅降级:Web站点在所有新式浏览器中都能正常工作,如果用户使用的是老式浏览器则代码会检查以确认它们是否能正常工作。由于 IE 独特的盒模型布局问题针对不同版本的 IE 的 hack实践过优雅降级了,为那些无法支持功能嘚浏览器增加候选方案使之在旧式浏览器上以某种形式降级体验却不至于完全失效。

(2)渐进增强:从被所有浏览器支持的基本功能开始逐步地添加那些只有新式浏览器才支持的功能,向页面增加无害于基础浏览器的额外样式和功能当浏览器支持时,它们会自动地呈現出来并发挥作用

内存泄漏指任何对象在你不在拥有或需要它之后仍然存在。

垃圾回收器定期扫描对象并计算引用了每个对象的其他對象的数量。如果一个对象的引用为0(没有其他对象引用过该对象)或对该对象的唯一引用是循环的,那么该对象的内存即可回收

(1)setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏

(4)循环引用(在两个对象彼此引用且彼此保留时就会产生一个循环引用)

動态改变某个类的某个方法的运行环境

请问以上程序的输出是()

  这是一个闭包,闭包可以用在许多地方它的最大用处有两个,一個是可以读取函数内部的变量另一个就是让这些变量的值始终保持在内存中。

  这里的局部变量 i 对 f1() 来说是全局变量,对 f2() 来说也是全局变量但是 f1() 的 i 和 f2() 的 i 有事相互独立不可见的,f1() 每执行一次f1() 的 i 就加 1 ,f2() 每执行一次f2() 的 i 就加 1,但是相互之间不影响因此是 010

a)如果包含,需偠返回匹配字符串 b 的位置 

b)如果不包含,需要返回-1 

方法/函数是由谁(对象)调用的,方法/函数内部的this就是指向谁(对象)

注意:是被誰调用不是处于谁的作用域,即使在作用域

3、这个立即执行匿名函数表达式(IIFE)是由window调用的this指向window

37、[不定项选择题] 下面有关 javascript 内部对象的描述,正确的有

Navagator:提供有关浏览器的信息。

Window:Window对象处于对象层次的最顶层它提供了处理Navagator窗口的方法和属性。

Location:提供了与当前打开的URL一起工作的方法和属性是一个静态的对象。

History:提供了与历史清单有关的信息

Document:包含与文档元素一起工作的对象,它将这些元素封装起来供编程人员使用

(1)首先,Node在当前目录下查找 package.json(CommonJS包规范定义的包描述文件)通过 JSON.parse() 解析出包描述对象,从中取出 main 属性指定的文件名进行萣位如果文件确实扩展名,将会进入扩展名分析的步骤

(3)如果在目录分析的过程中没有定位成功任何文件,则自定义模块进入下一個路径进行查找如果模块路径数组都被遍历完毕,依然没有查找到目标文件则会抛出查找失败异常。

  按照上面的思路首先应该查找 package.json 文件,看看里面有没有核心模块应该是 C 最先,

othermodule不是核心模块那么接着应该进入扩展名分析的步骤,就应该是查找 othermodule.js对应B

紧接着就昰以 index 为默认文件名,也就是A

再接下来就是上一个文件目录 D 了

40、[单选题]如下代码输出的结果是什么: 

做加法时要注意双引号,当使用双引號时JavaScript认为是字符串,字符串相加等于字符串合并

"A"-"B"的运算中需要先把 "A" 和 "B" 用 Number函数转换成数值,其结果是 NaN在减法操作中,如果有一个是 NaN則结果是NaN,因此 "A"-"B"结果为 NaN

然后和 “2” 进行字符串拼接变成了 NaN2

根据上述,"A"-"B"的结果为 NaN然后和数值2进行加法操作,在加法操作中如果有一个操作数是 NaN,则结果为 NaN

A.Ajax 的优势在意在于可搜索性开放性,易用性及易于开发 

B.Flash 的优势在于多媒体处理可以更容易的调用浏览器以外的外部資源 

C.Ajax 最主要的批评就是它可能破坏浏览器的后退功能 

D.flash 文件经常会很大,用户第一次使用的时候需要忍耐较长的等待时间 

(1)Ajax的优势:1.可搜索性 2.开放性 3.费用 4.易用性 5.易于开发

(2)Flash的优势:1.多媒体处理 2.兼容性 3.矢量图形 4.客户端资源调度

(3)Ajax的劣势:1.它可能破坏浏览器的后退功能  2.使用動态页面更新使得用户难于将某个特定的状态保存到收藏夹中   ---不过这些都有相关方法解决

(4)Flash的劣势:1.二进制格式  2.格式私有  3.flash文件经常会很夶用户第一次使用的时候需要忍耐较长的等待时间   4.性能问题

43、[问答题]  Flappy Bird 是风靡一时的手机游戏,玩家要操作一只小鸟穿过无穷无尽的由钢管组成的 障碍如果要你在 HTML 前端开发这个游戏,为了保证游戏的流畅运行并长时间运行也不 会崩溃,请列举开发要注意的性能问题和解決的方法 

(1)长时间运行会崩溃的原因就是 ‘内存泄漏’。我们在日常的JS程序中并不太在意内存泄漏问题因为JS解释器会有垃圾回收机淛,大部分无效内存会被回收另一方面JS运行在客户端,即使出现内存泄漏也不是太大的问题简单的刷新页面即可。但是如果要预防内存泄漏的场景还是要注意一些问题

(2)针对这个场景来说,即使长期运行出现内存泄漏的可能还是很低第一方面,数据量很少水管維护一个数组即可,然后每隔一段时间更新数组来达到水管长度不同的效果。小鸟只要维护一个对象即可通过移动水管检查碰撞就可鉯实现游戏逻辑。因为在浏览器端JS程序和页面UI渲染公用一条线程,如果计算时间过长会使渲染阻塞在HTML5中利用 webworker 已经可以开辟一个新线程專门负责计算解决这个问题了。

44、[问答题]  以下代码输出的值为( )

45、什么样的请求是简单请求?

 请求方法是以下三种方法之一:

 HTTP的请求頭信息不超出以下几种字段:

46、能说说首屏加载优化有哪些方案吗

  • 使用CDN加速,将通用的库从vendor进行抽离
  • 如果使用了一些UI库采用按需加载
  • 洳果首屏为登录页,可以做成多入口
  • 使用link标签的rel属性设置 prefetch(这段资源将会在未来某个导航或者功能要用到但是本资源的下载顺序权重比較低,prefetch通常用于加速下一次导航)、preload(preload将会把资源的下载顺序权重提高使得关键数据提前下载好,优化页面打开速度)

47、谈谈你对作用域链的理解

了解作用域链之前我们要知道以下几个概念:

  • 创建:JS解析引擎进行预解析将函数声明提前,同时将该函数放到全局作用域或當前函数的上一级函数的局部作用域中
  • 执行:JS引擎会将当前函数的局部变量和内部函数进行声明提前,然后再执行业务代码当函数执荇完退出时,释放该函数的执行上下文并注销该函数的局部变量。

变量和函数的声明:如果变量名和函数名声明时相同函数优先声明

VO對应的是函数创建阶段,JS解析引擎进行预解析时所有的变量和函数的声明,统称为 Variable Object该变量与执行上下文相关,知道自己的数据存储在哪里并且知道如何访问。VO是一个与执行上下文相关的特殊对象它存储着在上下文中声明的以下内容:

  • 变量(var,变量声明)

AO对应的是函數执行阶段当函数被调用执行时,会建立一个执行上下文该执行上下文包含了函数所需的所有变量,该变量共同组成了一个新的对象僦是Activetion Object该对象包含了:

        当代码在一个环境中创建时,会创建变量对象的一个作用域链来保证对执行环境有权访问的变量和函数作用域第┅个对象始终是当前执行代码所在环境的变量对象(VO)。如果是函数执行阶段那么将其AO作为作用域链第一个对象,第二个对象是上级函數的执行上下文AO下一个对象依次类推。

        当查找变量的时候会先从当前上下文的变量对象中查找,如果没有找到就会从父级(词法层媔上的父级)执行上下文的变量对象中查找,一直找到全局上下文的变量对象也就是全局对象。这样由多个执行上下文的变量对象构成嘚链表就叫做作用域链

 寄生组合式继承:

  所谓寄生组合式继承,及通过借用构造函数来继承属性通过原型链的混和形式来继承方法。其背后的基本思想是:不必为了指定子类型的原型而调用超类型的构造函数我们所需要的无非就是超类型原型的一个副本而已。本質上就是使用寄生式继承来继承超类型的原型,然后再将结果指定给子类型的原型

如果不设置子元素 left top的话,absolute的子元素是顶在父元素的 content咗上方的

  • absolute 元素覆盖正常文档流内元素(不用设 z-index自然覆盖)
  • static:默认值,位置设置为 static 的元素它始终会处于文档流给予的位置。
  • inherit:规定应该從父元素继承 position 属性的值但是任何版本的 IE 都不支持属性值 “inherit”
  • fixed:生成绝对定位的元素。默认情况下可定位于相对于浏览器窗口的指定坐標。但当祖先元素具有 transform 属性且不为 none 时就会相对于祖先元素指定坐标,而不是浏览器窗口
  • absolute:生成绝对定位的元素,相对于该元素最近的巳定位的祖先元素进行定位
  • relative:生成相对定位的元素,相对于该元素在文档中的初始位置进行定位

浮动、绝对定位和固定定位会脱离文檔流,相对定位不会脱离文档流绝对定位相对于该元素最近的已定位的祖先元素,如果没有一个祖先元素设置定位那么参照物是body

  • 如果祖先元素是块级元素,包含块则设置为该元素的内边距边界
  • 如果祖先元素是行内元素包含块则设置为该祖先元素的内容边界
  • 定位的元素嘚起始位置为父包含块的内边距(不会在border里,除非使用负值会在padding里)
  • 定位的元素的margin还是能起作用的
  • z-index是由层叠层级的,需要考虑同一个层疊上下文的层叠优先级
  • z-index是负值不会覆盖包含块的背景色(但是如果有内容会被包含块的内容覆盖)
  • z-index的值影响的元素是定位元素以及flex盒子
  • 仩面一个定位元素,下面一个正常流的元素定位元素会覆盖在正常流元素之上,除非给z-index是负值
  • 页面根元素html天生具有层叠上下文称之为“根层叠闪现给我”

50、讲讲MVVM,说说与MVC有什么区别

  MVC允许在不改变视图的情况下改变视图对用户输入的响应方式,用户对View的操作交给了Controller處理在Controller中响应View的事件调用Model的接口对数据进行操作,一旦Model发生变化便通知相关视图进行更新

  如果前端没有框架,只使用原生的 html+jsMVC模式可以这样理解。将html看作view;js看作controller负责处理用户与应用的交互,响应对view的操作(对事件的监听)调用Model对数据进行操作,完成model与view的同步(根据model的改变通过选择器对view进行操作);将js的ajax当做Model,也就是数据层通过ajax从服务器获取数据。

  Model看成模型View看成这个模型的视图化体现,而Controller根据需要写在各自的方法里

  MVVM与MVC最大的区别就是:它实现了View和Model的自动同步,也就是当Model的属性改变时我们不用再自己手动操作DOM元素,来改变View的显示而是改变属性后该属性对应View层会自动改变。

  从整体来看MVVM比MVC精简很多,不仅简化了业务与界面的依赖还解决了數据频繁更新的问题,不用再使用选择器操作DOM元素因为在MVVM中,View不知道Model的存在Model和ViewModel也观察不到View,这种低耦合模式提高代码的可重用性

51、說说事件委托有什么好处?

 事件委托就是利用事件冒泡机制指定一个事件处理程序来管理某一类型的所有事件。

即:利用冒泡的原理紦事件加到父级上,触发执行效果

  • 只在内存中开辟了一块空间,节省资源同时减少了DOM操作提供性能
  • 对于新添加的元素也会有之前的事件

 只有当事件流处于目标阶段的时候,两个的指向才是一样的而处于捕获和冒泡阶段的时候,target指向被单击的对象而currentTarget指向当前事件活动嘚对象(注册该事件的对象,一般为父级)

  •  网络代理,转发请求伪造响应

54、如何判断两个变量相等

该仓库未指定开源许可证未经莋者的许可,此代码仅用于学习不能用于其他用途。

项目仓库所选许可证以仓库主分支所使用许可证为准

我是木易杨公众号「高级前端进阶」作者,每天搞定一道前端大厂的面试面试题祝大家天天进步,一年后会看到不一样的自己

该操作需登录码云帐号,请先登录後再操作


企业级软件开发协作工具

代码托管 项目管理 文档协作 完备安全策略

我要回帖

更多关于 大厂的面试 的文章

 

随机推荐