为什么有别人讲过迷信的东西,有的东西肯定是解释不出来的,然后讲解释不出来的肯定是不存在或者不科学的???

复习前端面试的知识,是为了巩固前端的基础知识,最重要的还是平时的积累!

注意:文章的题与题之间用下划线分隔开,答案仅供参考。

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


  • 不论鼠标指针穿过被选元素或其子元素,都会触发 mouseover 事件,对应 mouseout。
  • 只有在鼠标指针穿过被选元素时,才会触发 mouseenter 事件,对应 mouseleave。

用正则表达式匹配字符串,以字母开头,后面是数字、字符串或者下划线,长度为 9 - 20 



手机号码格式验证方法(正则表达式验证)支持最新电信 199, 移动 198, 联通 166

// 手机号码校验规则
 
这样 phone_number 就是取到的手机号码,即可!


 
js 字符串两边截取空白的 trim 的原型方法的实现
js 中本身是没有 trim 函数的。
// 删除左右两端的空格
 

 
介绍一下你对浏览器内核的理解 ?


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

解析和执行 javascript 来实现网页的动态效果。
最开始渲染引擎和 JS 引擎并没有区分的很明确,后来 JS 引擎越来越独立,内核就倾向于只指渲染引擎。

 
哪些常见操作会造成内存泄漏 ?
内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。
垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收。
  • setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。
  • 闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)。
 

 
  • 一个程序至少有一个进程,一个进程至少有一个线程。
  • 线程的划分尺度小于进程,使得多线程程序的并发性高。
  • 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
 
线程在执行过程中与进程还是有区别的。
  • 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
  • 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。
 
但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

 

eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

 

 

 
 
只要记住 0 与 任何数都是 0,其他反推。
 
 

 


代码解析:这道题的考点分两个
  1. 运算符(赋值预算,逗号运算)
 
先看第一个输出:25,因为 ( inner.func, inner.func ) 是进行逗号运算符,逗号运算符就是运算前面的 ”,“ 返回最后一个,举个栗子

而且这个匿名函数是属于 window 的,则变成了





此刻,道理就和第一个 console.log 一样了,输出的结果是 25。

 
下面程序输出的结果是 ?
代码解析:如果 window 不包含属性 a,就声明一个变量 a,然后赋值为 1。
你可能认为 alert 出来的结果是 1,然后实际结果是 “undefined”。
要了解为什么,需要知道 JavaScript 里的 3 个概念。

第二,所有的变量声明都在范围作用域的顶部,看一下相似的例子:
此时,尽管声明是在 alert 之后,alert 弹出的依然是 true,这是因为 JavaScript 引擎首先会扫描所有的变量声明,然后将这些变量声明移动到顶部,最终的代码效果是这样的:
这样看起来就很容易解释为什么 alert 结果是 true 了。
第三,你需要理解该题目的意思是,变量声明被提前了,但变量赋值没有,因为这行代码包括了变量声明和变量赋值。
你可以将语句拆分为如下代码:
当变量声明和赋值在一起用的时候,JavaScript 引擎会自动将它分为两部以便将变量声明提前,
不将赋值的步骤提前,是因为他有可能影响代码执行出不可预期的结果。
所以,知道了这些概念以后,重新回头看一下题目的代码,其实就等价于:
这样,题目的意思就非常清楚了:首先声明 a,然后判断 a 是否在存在,如果不存在就赋值为1,很明显 a 永远在 window 里存在,这个赋值语句永远不会执行,所以结果是 undefined。
提前这个词语显得有点迷惑了,你可以理解为:预编译。

 
下面程序输出的结果是 ?
这个题目看起来比实际复杂,alert 的结果是 1。
这里依然有 3 个重要的概念需要我们知道。
  • 首先,第一个是 变量声明在进入执行上下文就完成了
  • 第二个概念就是函数声明也是提前的,所有的函数声明都在执行代码之前都已经完成了声明,和变量声明一样
 
澄清一下,函数声明是如下这样的代码:
如下不是函数,而是函数表达式,相当于变量赋值:
澄清一下,函数表达式没有提前,就相当于平时的变量赋值。
  • 第三需要知道的是,函数声明会覆盖变量声明,但不会覆盖变量赋值
 
为了解释这个,我们来看一个例子:
尽管变量声明在下面定义,但是变量 value 依然是 function,也就是说这种情况下,函数声明的优先级高于变量声明的优先级,但如果该变量 value 赋值了,那结果就完全不一样了:
该 value 赋值以后,变量赋值初始化就覆盖了函数声明。
重新回到题目,这个函数其实是一个有名函数表达式,函数表达式不像函数声明一样可以覆盖变量声明,但你可以注意到,变量 b 是包含了该函数表达式,而该函数表达式的名字是 a。不同的浏览器对 a 这个名词处理有点不一样,在 IE 里,会将 a 认为函数声明,所以它被变量初始化覆盖了,就是说如果调用 a(–x) 的话就会出错,而其它浏览器在允许在函数内部调用 a(–x),因为这时候 a 在函数外面依然是数字。
基本上,IE 里调用 b(2) 的时候会出错,但其它浏览器则返回 undefined。
理解上述内容之后,该题目换成一个更准确和更容易理解的代码应该像这样:
这样的话,就很清晰地知道为什么 alert 的总是 1 了。

 
下面程序输出的结果是 ?
alert 的值是下面的函数
这个题目比较简单:即函数声明和变量声明的关系和影响,遇到同名的函数声明,不会重新定义。

 
下面程序输出的结果是 ?

活动对象是在进入函数上下文时刻被创建的,它通过函数的 arguments 属性初始化。

 
三道判断输出的题都是经典的题
明显输出是 3,因为里面修改了 a 这个全局变量,那个 function a(){} 是用来干扰的,虽然函数声明会提升,就被 a 给覆盖掉了,这是我的理解。
不记得具体的,就类似如下
第一个输出是 2,第二个输出是 3。
这题考察的就是 this 的指向,函数作为对象本身属性调用的时候,this 指向对象,作为普通函数调用的时候,就指向全局了。

典型的闭包,弹出 5 。

 

  • object 对象类型,复杂的一组描述信息的集合
 

 

null 用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。 null 表示"没有对象",即该处不应该有值。
null 典型用法是:
  • 作为函数的参数,表示该函数的参数不是对象。 
  • 作为对象原型链的终点。
 
当声明的变量还未被初始化时,变量的默认值为 undefined。 undefined 表示"缺少值",就是此处应该有一个值,但是还没有定义。
  • 变量被声明了,但没有赋值时,就等于 undefined。 
  • 调用函数时,应该提供的参数没有提供,该参数等于 undefined。 
  • 对象没有赋值的属性,该属性的值为 undefined。 
  • 函数没有返回值时,默认返回 undefined。
 

 
  • 1 是一个原始定义好的 number 类型;
  • Number(1) 是一个函数类型,是我们自己声明的一个函数(方法)。
 

 

prototype 是函数对象上面预设的对象属性。

 
函数里的 this 什么含义,什么情况下,怎么用 ?
  • 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。
  • 随着函数使用场合的不同,this 的值会发生变化。
  • 但是有一个总的原则,那就是 this 指的是,调用函数的那个对象
 
情况一:纯粹的函数调用
这是函数的最通常用法,属于全局性调用,因此 this 就代表全局对象 window。   
为了证明 this 就是全局对象,我对代码做一些改变:   



函数还可以作为某个对象的方法调用,这时 this 就指这个上级对象
  

所谓构造函数,就是通过这个函数生成一个新对象(object)。这时的 this 就指这个新对象。
运行结果为 1。为了表明这时 this 不是全局对象,对代码做一些改变:
  
运行结果为 2,表明全局变量 x 的值没变。

apply() 是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。因此,this 指的就是这第一个参数。   
apply() 的参数为空时,默认调用全局对象。因此,这时的运行结果为 0,证明 this 指的是全局对象。

如果把最后一行代码修改为
运行结果就变成了 1,证明了这时 this 代表的是对象 o。

 


既然作为方法的属性,那它们的使用就当然是针对方法的了,这两个方法是容易混淆的,因为它们的作用一样,只是使用方式不同。
  • 相同点:两个方法产生的作用是完全一样的。
  • 不同点:方法传递的参数不同。
 
每个函数对象会有一些方法可以去修改函数执行时里面的 this,比较常见得到就是 call 和 apply,通过 call 和 apply 可以重新定义函数的执行环境,即 this 的指向。 //传参的时候是扁平的把每个参数传进去 //传参的时候是把参数作为一个数组传进去 // 用来调用一些无法直接调用的方法

 
异步过程的构成要素有哪些?和异步过程是怎样的 ?
总结一下,一个异步过程通常是这样的:
  • 主线程发起一个异步请求,相应的工作线程接收请求并告知主线程已收到(异步函数返回);
  • 主线程可以继续执行后面的代码,同时工作线程执行异步任务;
  • 工作线程完成工作后,通知主线程;
  • 主线程收到通知后,执行一定的动作(调用回调函数)。
 
  1. 它可以叫做异步过程的发起函数,或者叫做异步任务注册函数。
 
所以,从主线程的角度看,一个异步过程包括下面两个要素:
  • 发起函数(或叫注册函数) A。
 
它们都是在主线程上调用的,其中注册函数用来发起异步过程,回调函数用来处理结果。

其中的 setTimeout 就是异步过程的发起函数,fn 是回调函数。
注意:前面说的形式 A(args..., callbackFn) 只是一种抽象的表示,并不代表回调函数一定要作为发起函数的参数。

发起函数和回调函数就是分离的。

 
说说消息队列和事件循环
  • 主线程在执行完当前循环中的所有代码后,就会到消息队列取出这条消息(也就是 message 函数),并执行它。
  • 完成了工作线程对主线程的通知,回调函数也就得到了执行。
  • 如果一开始主线程就没有提供回调函数,AJAX 线程在收到 HTTP 响应后,也就没必要通知主线程,从而也没必要往消息队列放消息。
 
异步过程的回调函数,一定不在当前的这一轮事件循环中执行。
 

 
  • session 保存在服务器,客户端不知道其中的信息;
  • cookie 保存在客户端,服务器能够知道其中的信息。 
  • session 不能区分路径,同一个用户在访问一个网站期间,所有的 session 在任何一个地方都可以访问到。
  • 而 cookie 中如果设置了路径参数,那么同一个网站中不同路径下的 cookie 互相是访问不到的。  
 

 
  • cookies 是一些存储在用户电脑上的小文件。
  • 它是被设计用来保存一些站点的用户数据,这样能够让服务器为这样的用户定制内容,后者页面代码能够获取到 cookie 值然后发送给服务器。
  • 比如 cookie 中存储了所在地理位置,以后每次进入地图就默认定位到改地点即可。
 

 

  • 都是保存在浏览器端,且同源的。
 
  • cookie 数据始终在同源的 http 请求中携带(即使不需要),即 cookie 在浏览器和服务器间来回传递。
  • cookie 数据还有路径(path)的概念,可以限制 cookie 只属于某个路径下。
  • 存储大小限制也不同,cookie 数据不能超过 4k,同时因为每次 http 请求都会携带 cookie,所以 cookie 只适合保存很小的数据,如会话标识。
  • 数据有效期不同,sessionStorage:仅在当前浏览器窗口关闭前有效,自然也就不可能持久保持;localStorage:始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据;cookie 只在设置的 cookie 过期时间之前一直有效,即使窗口或浏览器关闭。
  • 作用域不同,sessionStorage 在不同的浏览器窗口中不共享,即使是同一个页面;cookie 和 localStorage 在所有同源窗口中都是共享的。
 

 
从敲入 URL 到渲染完成的整个过程,包括 DOM 构建的过程,说的约详细越好
  • 用户输入 url 地址,浏览器根据域名寻找 IP 地址
  • 浏览器向服务器发送 http 请求,如果服务器段返回以 301 之类的重定向,浏览器根据相应头中的 location 再次发送请求
  • 服务器端接受请求,处理请求生成 html 代码,返回给浏览器,这时的 html 页面代码可能是经过压缩的
  • 浏览器接收服务器响应结果,如果有压缩则首先进行解压处理,紧接着就是页面解析渲染
  • 解析渲染该过程主要分为以下步骤:解析 HTML、构建 DOM 树、DOM 树与 CSS 样式进行附着构造呈现树
 

 
是否了解公钥加密和私钥加密。如何确保表单提交里的密码字段不被泄露。
公钥用于对数据进行加密,私钥用于对数据进行解密。
很直观的理解:公钥就是公开的密钥,其公开了大家才能用它来加密数据。私钥是私有的密钥,谁有这个密钥才能够解密密文。

form 在提交的过程中,对密码字段是不进行加密而是以明码的形式进行数据传输的。
如果要对数据进行加密,你可以自己写一个脚本对内容进行编码后传输,只是这个安全性也并不高。

如果想对数据进行加密,你可以使用 HTTPS 安全传输协议,这个协议是由系统进行密码加密处理的,在数据传输中是绝对不会被拦截获取的,只是 HTTPS 的架设会相对麻烦点。一些大型网站的登录、银行的在线网关等都是走这条路。

 
验证码是干嘛的,是为了解决什么安全问题。
所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片, 图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。
  • 验证码一般是防止批量注册的,人眼看起来都费劲,何况是机器。
  • 像百度贴吧未登录发贴要输入验证码大概是防止大规模匿名回帖的发生。
  • 目前,不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。
 

 


 
判断一个字符串中出现次数最多的字符,统计这个次数
  • 将字符串转化数组 
  • 遍历数组,判断对象中是否存在数组中的值,如果存在值 +1,不存在赋值为 1
  • 定义两个变量存储字符值,字符出现的字数
// 1.将字符串转换成数组
// 2.创建一个对象
// 3. 所有字母出现的次数,判断对象中是否存在数组中的值,如果存在值 +1,不存在赋值为 1
// 4 定义两个变量存储字符值,字符出现的字数
 

 
  • document.write 是直接写入到页面的内容流,如果在写之前没有调用 document.open, 浏览器会自动调用 open。每次写完关闭之后重新调用该函数,会导致页面被重写。
  • innerHTML 将内容写入某个 DOM 节点,不会导致页面全部重绘。
  • innerHTML 很多情况下都优于 document.write,其原因在于其允许更精确的控制要刷新页面的那一个部分。
 

 
JS 识别不同浏览器信息

 


 
编写一个方法,求一个字符串的字节长度
假设:一个英文字符占用一个字节,一个中文字符占用两个字节

 
  • 核心(ECMAScript) 描述了该语言的语法和基本对象
  • 文档对象模型(DOM) 描述了处理网页内容的方法和接口
  • 浏览器对象模型(BOM) 描述了与浏览器进行交互的方法和接口
 

 
new 操作符具体干了什么呢 ?
  • 创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
  • 属性和方法被加入到 this 引用的对象中。
  • 新创建的对象由 this 所引用,并且最后隐式的返回 this 。
 

 
  • 数据格式简单,易于读写,占用带宽小。
 

 
你有哪些性能优化的方法 ?
web 前端是应用服务器处理之前的部分,前端主要包括:HTML、CSS、javascript、image 等各种资源,针对不同的资源有不同的优化方式。
  • 减少 HTTP 请求数。这条策略是最重要最有效的,因为一个完整的请求要经过 DNS 寻址,与服务器建立连接,发送数据,等待服务器响应,接收数据这样一个消耗时间成本和资源成本的复杂的过程。
 
  • 延迟加载组件,预加载组件
  • 减少 DOM 元素数量。页面中存在大量 DOM 元素,会导致 javascript 遍历 DOM 的效率变慢。
  • 最小化 iframe 的数量。iframes 提供了一个简单的方式把一个网站的内容嵌入到另一个网站中。但其创建速度比其他包括 JavaScript 和 CSS 的 DOM 元素的创建慢了 1-2 个数量级。
  • 避免 404。HTTP 请求时间消耗是很大的,因此使用 HTTP 请求来获得一个没有用处的响应(例如 404 没有找到页面)是完全没有必要的,它只会降低用户体验而不会有一点好处。
 
  • 使用内容分发网络(CDN)。把网站内容分散到多个、处于不同地域位置的服务器上可以加快下载速度。
  • 设置 ETag:ETags(Entity tags,实体标签)是 web 服务器和浏览器用于判断浏览器缓存中的内容和服务器中的原始内容是否匹配的一种机制。
 
 
  • 避免使用 CSS 表达式
 
 
在实际应用中使用外部文件可以提高页面速度,因为 JavaScript 和 CSS 文件都能在浏览器中产生缓存。
  • 开发智能的事件处理程序
 
  • 不要在 HTML 中使用缩放图片
 

 
JS 格式化数字(每三位加逗号)

 


然而,这个函数并不适用于合并大的数组,因为它需要创建一个新的数组,而这会消耗很多内存。
这时,你可以使用 Array.push.apply(arr1, arr2) 来代替创建新的数组,它可以把第二个数组合并到第一个中,从而较少内存消耗。

 



 

不适用 Lodash 等这些库打乱数组元素顺序,你可以使用这个技巧:

 
  • onload 是等 HTML 的所有资源都加载完成后再执行 onload 里面的内容,所有资源包括 DOM 结构、图片、视频 等资源;
  • 另外,onload 只能有一个,ready 可以有多个。
 

 


从语义上理解就比较好理解了,大概就是当变量进入到某个环境中的时候就把这个变量标记一下,比如标记为“进入环境”,当离开的时候就把这个变量的标记给清除掉,比如是“离开环境”。而在这后面还有标记的变量将被视为准备删除的变量。
  • 垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记(可以使用任何标记方式)。
  • 然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记。
  • 而在此之后再被加上的标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。
  • 最后,垃圾收集器完成内存清除工作。销毁那些带标记的值并回收它们所占用的内存空间。
 
这是 javascript 最常见的垃圾回收方式。至于上面有说道的标记,到底该如何标记 ?
好像是有很多方法,比如特殊位翻转,维护一个列表什么的。
  • 引用计数的含义是跟踪记录每个值被引用的次数,当声明一个变量并将一个引用类型的值赋给该变量时,这个时候的引用类型的值就会是引用次数 +1 了。如果同一个值又被赋给另外一个变量,则该值的引用次数又 +1。
  • 相反如果包含这个值的引用的变量又取得另外一个值,即被重新赋了值,那么这个值的引用就 -1 。当这个值的引用次数编程 0 时,表示没有用到这个值,这个值也无法访问,因此环境就会收回这个值所占用的内存空间回收。
  • 这样,当垃圾收集器下次再运行时,它就会释放引用次数为 0 的值所占用的内存。
 

 

对于新人来说,JavaScript 的原型是一个很让人头疼的事情,一来 prototype 容易与 proto 混淆,




/*1、字面量方式*/
/*2、构造器方式*/
 















 


要理解闭包,首先必须理解 Javascript 特殊的变量作用域。
变量的作用域无非就是两种:全局变量和局部变量。
Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。
另一方面,在函数外部自然无法读取函数内的局部变量。
这里有一个地方需要注意,函数内部声明变量的时候,一定要使用 var 命令。
如果不用的话,你实际上声明了一个全局变量!
二、如何从外部读取局部变量 ?
既然 f2 可以读取 f1 中的局部变量,那么只要把 f2 作为返回值,我们不就可以在 f1 外部读取它的内部变量了吗!

上一节代码中的 f2 函数,就是闭包。
我的理解是,闭包就是能够读取其他函数内部变量的函数
由于在 Javascript 语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成 定义在一个函数内部的函数
所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁

闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
怎么来理解呢 ?请看下面的代码。
在这段代码中,result 实际上就是闭包 f2 函数。它一共运行了两次,第一次的值是 999,第二次的值是 1000。这证明了,函数 f1 中的局部变量 n 一直保存在内存中,并没有在 f1 调用后被自动清除。

原因就在于 f1 是 f2 的父函数,而 f2 被赋给了一个全局变量,这导致 f2 始终在内存中,而 f2 的存在依赖于 f1,因此 f1 也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
这段代码中另一个值得注意的地方,就是
  • 其次,nAdd 的值是一个匿名函数(anonymous function),而这个匿名函数本身也是一个闭包,所以 nAdd 相当于是一个 setter,可以在函数外部对函数内部的局部变量进行操作。
 
  • 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在 IE 中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
  • 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
 

 

问题:想每次点击对应目标时弹出对应的数字下标 0~4 ,但实际是无论点击哪个目标都会弹出数字 5。
问题所在:arr 中的每一项的 onclick 均为一个函数实例(Function 对象),这个函数实例也产生了一个闭包域,这个闭包域引用了外部闭包域的变量,其 function scope 的 closure 对象有个名为 i 的引用,外部闭包域的私有变量内容发生变化,内部闭包域得到的值自然会发生改变。

解决思路:增加若干个对应的闭包域空间(这里采用的是匿名函数),专门用来存储原先需要引用的内容(下标),不过只限于基本类型(基本类型值传递,对象类型引用传递)。
//声明一个匿名函数,若传进来的是基本类型则为值传递,故不会对实参产生影响,
//尽管引用 i 的值随外部改变 ,但本地私有变量(形参) arg 不会受影响,其值在一开始被调用的时候就决定了
 //只要 外部空间的 arg 不变,这里的引用值当然不会改变
 })(i); //立刻执行该匿名函数,传递下标 i (实参)
 



解决思路:将事件绑定在新增的匿名函数返回的函数上,此时绑定的函数中的 function scope 中的 closure 对象的 引用 arg 是指向将其返回的匿名函数的私有变量 arg








 
JavaScript 判断一个变量是对象还是数组 ?

在 JavaScript 中所有数据类型严格意义上都是对象,但实际使用中我们还是有类型之分,如果要判断一个变量是数组还是对象使用 typeof 搞不定,因为它全都返回 object。



利用 instanceof 判断数据类型是对象还是数组时应该优先判断 array,最后判断 object。

 
ES5 的继承和 ES6 的继承有什么区别 ?
ES5 的继承时通过 prototype 或构造函数机制来实现。
  • ES5 的继承实质上是先创建子类的实例对象,然后再将父类的方法添加到 this 上(Parent.apply(this))
  • ES6 的继承机制完全不同,实质上是先创建父类的实例对象 this(所以必须先调用父类的 super()方法),然后再用子类的构造函数修改 this
 
具体的:ES6 通过 class 关键字定义类,里面有构造方法,类之间通过 extends 关键字实现继承。子类必须在 constructor 方法中调用 super 方法,否则新建实例报错。因为子类没有自己的 this 对象,而是继承了父类的 this 对象,然后对其进行加工。如果不调用 super 方法,子类得不到 this 对象。
ps:super 关键字指代父类的实例,即父类的 this 对象。在子类构造函数中,调用 super 后,才可使用 this 关键字,否则报错。

 

先将字符串转成一个数组,然后用数组的 reverse() + join() 方法。

 
说说堆和栈的区别 ?
 
一、堆栈空间分配区别
  
  • 栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;  
  • 堆(操作系统):一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收,分配方式倒是类似于链表。  
 
  • 栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;  
  • 堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。  
 
  • 堆(数据结构):堆可以被看成是一棵树,如:堆排序;  
  • 栈(数据结构):一种先进后出的数据结构。
 

 

js 经典面试知识文章

 
 

 
 
ES6 声明变量的六种方法
  • 还有两种声明变量的方法:import 命令和 class 命令。
 

 



  • 由于整个 script 也属于一个 macrotask,由于会先执行 macrotask 中的第一个任务,再加上 promise 构造函数因为是同步的,所以会先打印出 1 和 2;
  • 由于在第一步中已经执行完了第一个 macrotask ,所以接下来会顺序执行所有的 microtask,也就是 promise.then 的回调函数,从而打印出 5;
  • microtask 队列中的任务已经执行完毕,继续执行剩下的 macrotask 队列中的任务,也就是 setTimeout,所以打印出 4。
 

 

ES6+ 面试知识文章

 
 
 

如果觉得本文还不错,记得给个 star , 你的 star 是我持续更新的动力!。
听说点收藏,不点赞的都是在耍流氓 -_-

  ※ 这个页面所介绍的是最详细的,可以让你没有难度的进行游戏。若想更有趣的进行游戏那么就不要阅读以下攻略。

  等级5以上的人物登录到洛奇时就会看到女神降临的动画。

  1. 希德赫雪原任务

  到了爱琳白色信鸽会把下面的任务交给你。 (只有等级在5以上的人物才能得到这个任务。 )

  你可以在迪尔科内尔北边的希德赫南部雪原看到雪人。虽然有无数个雪人但你只能从一个雪人当中获得耳环。

  与有14个牙齿的雪人不同,会掉出耳环的雪人有16个牙齿。 在附近的指示板也会得到一些提示,要仔细观察。用力拍打雪人就会掉出‘丢失的耳环’。

  现在拿着这个耳环去邓肯那里就可以完成任务了。在和邓肯的对话中可以获得进行新任务的信息。

  2. 三勇士记忆地下城

  根据邓肯提供的信息去希德赫北部雪原的德洛伊德祭坛看看吧。至少要带两三个魔法药草。在太阳升起时到达祭坛就能见到NPC 熊了。(要注意在阿维卡升起时不能见到熊)

  把准备好的魔法药草一个个送给熊,送出一个之后和他说说话,然后再送就这样送出三个之后就可以得到‘塔拉克’这个关键字。

  回到迪尔科内尔和邓肯用关键字‘塔拉克’对话就能听到传说中为了救出女神把迪尔纳诺降临到这个世上而离开的三勇士塔拉克、鲁拉里、玛丽的故事。最后村长会告诉你他们三个无一生还,并且获得‘消失的三勇士’这个关键字。

  获得‘消失的三勇士’关键字后‘塔拉克’关键字就会消失。若想听其他NPC怎样说‘塔拉克’就把邓肯放到最后交谈。用新的关键字和拉莎或恩迪莉等其他NPC对话能够得到去找敦巴伦斯图尔特的信息。 和斯图尔特用‘消失的三勇士’关键字对话可以听到关于三勇士的故事并且可以获得纪念物品。

  纪念物品是装载持有人记忆的物品。把物品放到指定的地下城可以经历这个物品持有人曾经经历过的故事。

  塔拉克项坠可以用于伊比地下城。用和塔拉克项坠一起收到的‘红色女神翅膀’飞到伊比地下城的大厅吧。

  三勇士记忆地下城是只有三人组队的队伍才能经历的。你要挑选两个和你一起进行新任务的勇士。进行时一定会有要三人组队完成的部分。

  成为3人组队的队长之后把塔拉克项坠放到伊比地下城的祭坛就可以体验记忆地下城了。拥有项坠的队长一定会成为塔拉克,另外两个队员将成为鲁拉里和玛丽中的任意一个。

  住在迪尔科内尔的塔拉克、玛丽、鲁拉里寻找着伊比地下城。那里住着爱琳没有的巨大蜘蛛。(其实看看也就是新手每日打的白蜘蛛...)

  因为三勇士非常强大蜘蛛们看起来不堪一击。

  在中间播放的动画中最好不要略过中间的对话,因为在记忆地下城内组队队长的权限比较大,所以应该注意如果队长略过对话那么其他队员也会略过。成为塔拉克的队长应该考虑到其他队员的情况。

  3. 希德赫雪原的夜晚

  完成三勇士记忆地下城后就可以得到‘茉莉安女神’这个关键字。这个关键字只有组队队长才能得到,用这个关键字和迪尔科内尔教堂的麦文牧师谈谈。

  和麦文用‘茉莉安女神’关键字对话可以获得新的关键字‘希德赫雪原的夜晚’和一本书。这时‘茉莉安女神’关键字就会消失。这本书的名字是‘成为石头的女神的故事’和G1有着很多的联系有必要读一读。

  谈话中会得知‘塔拉克’是三勇士中唯一存活下来的人。再重新返回希德赫雪原,要注意等级10级以下的不能进入希德赫雪原。

  晚上在希德赫北部雪原尽头的德洛伊德祭坛可以看到代替熊的NPC。他就是在三勇士记忆地下城看到的‘塔拉克’。(参考,在阿维卡升起的瞬间在祭坛旁边可以看到熊变身为塔拉克)

  和塔拉克用‘希德赫雪原的夜晚’关键字对话可以获得新的关键字‘永远的迪尔纳诺’。另外还可以知道为什么白天变成熊的原因和关于女神托梦的故事。

  另外推荐‘永远的迪尔纳诺’这本书。既然说敦巴伦的书店有那么看来就要去敦巴伦看看了。通过杜加德走廊伐木场奔向敦巴伦吧。 G1的任务要走遍爱琳的每一个地方所以有蜜蜡翅膀的话将非常便利。

  4. 永远的迪尔纳诺

  到敦巴伦要和书店的主人蕾拉用‘永远的迪尔纳诺’对话。第一次她会说现在忙,过一会儿来的话会帮你准备好。洛奇时间几天之后你去的话她会告诉你因为书的销量不好所以退回去了。
第三次会告诉你已经联系了总出版社印刷还要等一等。(‘永远的迪尔纳诺’关键字会消失 )

  不久之后信鸽就会把任务传递给你。从蕾拉那里取到‘永远的迪尔纳诺’就完成任务了。

  ‘永远的迪尔纳诺’可以像技能书一样进行精读。精读成功就可以得到新的关键字‘乐园’。用这个关键字重新和希德赫雪原的塔拉克交谈。

  5. 魔族通行证,魔族勋章

  ‘乐园’关键字的说明上会有去找塔拉克的提示。到了晚上去希德赫北部雪原和塔拉克用‘乐园’关键字对话。

  塔拉克会说读了永远的迪尔纳诺这本书会使你抛弃对迪尔纳诺的憧憬。谈话中会得到‘棕色魔族通行证’。

  使用和魔族通行证一起得到的红色女神翅膀可以和队员一起直接飞到巴里地下城的大厅。可以独自一人进行也可以组队,组队最多3个人。

  将棕色魔族通行证丢入巴里地下城的祭坛,会看到各种蜘蛛、吸血蝙蝠、鬼魔、飞剑、巨大蠕虫等平时在野外或地下城看不到的怪物。在地下城进行当中如果退出或出现其他问题可以回到塔拉克那里谈话重新获得棕色魔族通行证。

  到了Boss的房间会看到带着小精灵的黑暗巫师。这时会看到黑暗巫师用茉莉安女神的名义战斗。帮助魔族的女神?茉莉安女神到底是怎样了?

  通过地下城后组队队长能够得到‘魔族的奖章’。得到这个物品之后不能再用塔拉克给的棕色魔族通行证生成地下城(只有参与到别人的组队时才有可能)。只要拿起‘魔族的奖章’就不能丢在地上也不能烧掉,更不能配戴。

  6. 牧师的纪念品

  在获得‘魔族的奖章’的同时可以获得 ‘魔族的奖章’关键字。 用这个关键字和各个村子里的牧师谈话。谈话的顺序并不重要,但关键在于和所有的牧师、修女谈话之后才能获得下一个关键字。

  离巴里地下城最近的牧师康甘会说不清楚。敦巴伦的克莉斯特好像知道点什么但不会告诉你。经过迪尔科内尔的恩迪莉,最后和麦文谈话时他会告诉你魔族的奖章和雷米拉斯教修女被赋予的牧师的纪念品一样。同时你也会获得‘牧师的奖章’关键字。

  之后麦文会给你‘与魔族对话’的提示。会说话的魔族第一个想到的可能是女妖。但能够自如的说人类语言的魔族在迪尔科内尔。是在竞技场的叫格鲁的哥布林。

  给格鲁看魔族的奖章的话很明显背面写的是魔族文字,他会读出‘多尔博拉乌达译兰塞恩’,因为小的时候学过魔族文字所以可以给你解释,但需要条件,要找回格鲁在赛尔低级地下城丢失的戒指。

  要是听格鲁的话独自一人进入赛尔低级地下城你会发现不一会儿你的经验值就扣到负数了。赛尔低级地下城有很多像蛇、各种蜘蛛、骷髅、鼠人等很强的怪物,所以最好组队和队员一起进入地下城。只是在打开Boss 房间房门时地下城只剩下你一个人就可以了。因为任务要求和Boss黑石巨人进行1:1的战斗。

  通过赛尔低级地下城后在宝箱内可以找到格鲁丢失的戒指。把戒指送给格鲁后他就会为你解释奖章背面的文字是“女神啊,借给我月光吧”...完成格鲁的任务后会得到新的关键字:多儿博拉乌达译兰塞恩。用这个关键字和塔拉克对话,会发现格鲁这个解释是不对的。塔拉克说是“女神,请赐予我你的魔力”的意思。再重新回到格鲁那里抗议的话会听到是他弄错了,为了表示歉意他将介绍给大家认识知道精灵语言的女妖。

  7. 塔拉克眼镜袋,拉比地下城的记忆

  前面的情节中塔拉克会说给他魔族的奖章的话就会给你解释。这时可以得到新的关键字。再和其他NPC谈话也不会有什么收获了,去和敦巴伦的克莉斯特谈话吧。

  和克莉斯特谈话可以得到塔拉克的第二个记忆物品。这个记忆物品可以在拉比地下城使用。

  用这个进入地下城可以扮演塔拉克在拉比地下城中独自通关记忆。因为塔拉克的魔法相当强大所以就算是独自通关感觉也不会太难。到达Boss 房间之后会有只有在G1才能看到的非常刺激的事件。结束记忆地下城后用新关键字‘克莉斯特的过去’再去找克莉斯特对话,会得到‘克莉斯特的传言’这一关键字。

  回到希德赫雪原用新的关键字‘克莉斯特的传言’和塔拉克谈话。塔拉克会告诉你要是克莉斯特也许可以帮你翻译这本书,然后会给你‘魔族的书’,当然读了也不能领会书中的内容。接到‘翻译魔族的书’的任务再回到敦巴伦把书带给克莉斯特。

  与克莉斯特约好翻译这本书,洛奇时间过了12小时之后猫头鹰就会通知你书翻译完了。但是,克莉斯特会说塔拉克亲自来才能把这本书给你。没办法只能再回去找塔拉克。

  8. 塔拉克的嘱托

  找到塔拉克他会嘱托你去找麦文取回寄存的东西。找到麦文,他会让你去拉莎老师那里。这时关于魔族的书的任务就告一段落了,并且在和麦文说话后会得到“麦文的嘱托”的关键字。

  过一会儿交谈她会告诉你为了那样物品需要一瓶圣水。交给她圣水后,需要等待一段时间,在洛奇时间的12小时之后,信鸽会送来任务。

  在拉莎那里得到‘黑玫瑰’之后重新找塔拉克谈话。

  要注意的是只有在晚上才能见到塔拉克。所以在进行任务时安排好时间也非常重要 。

  现在再回到克莉斯特那里完成任务之后就可以得到复仇的书的翻译本了。精读复仇的书之后可以获得‘玛鲁斯’关键字。

  9. 玛鲁斯记忆地下城

  用‘玛鲁斯’关键字和邓肯对话可以得到“玛鲁斯 酷依迪恩”关键字。和塔拉克谈话可以得知玛鲁斯是德鲁伊、塔拉克的老师。在这次谈话中可以得知‘玛鲁斯的遗失物品’关键字。

  说到丢失物就会想到市政厅的伊文。再回到敦巴伦问伊文可以得知克莉斯特刚刚拿走。去教堂和克莉斯特交谈可以获得记忆物品“坏掉的托克”。

  坏掉的托克可以用于玛斯地下城。这个记忆地下城也是独自闯关的地下城。用红色女神翅膀直接飞到玛斯地下城把坏掉的托克放到祭坛就可以体验玛鲁斯的记忆地下城了。

  玛鲁斯的3大魔法都是1级所以非常容易。到达Boos房间之后会遇到幽灵盔甲军团。

  10. 魔族的书,第二册

  通过玛鲁斯记忆地下城之后可以获得‘茉莉安女神的报复’关键字。按照关键字上的说明和邓肯谈话。邓肯会说亲眼看了书里的内容之后才能确认,看来还要回到塔拉克那里要回书籍。 这时得到“又拿到复仇之书”任务。

  到希德赫雪原取回书之后邓肯会说‘这书好像应该是3步曲’。先去询问克莉斯特关于书的情况,然后她会告诉你去书店主人蕾拉那里问问。和蕾拉不停地说她会告诉你等一段时间会帮你弄到。这时“又拿到复仇之书”任务完成。听蕾拉的话在洛奇的世界里待上约12个小时就会有信鸽给你送来任务。

  再和蕾拉谈话会听到“永远的迪尔纳诺”的作者莱斯利的故事。她会告诉你莱斯利曾经在赛尔地下城见过复仇之书原件,所以可以到赛尔地下城看看。完成任务后可以获得新的关键字‘魔术师的备忘录’和这个物品。

  可以用得到的红色女神翅膀直接飞到赛尔地下城大厅。因为不是记忆地下城或是有人员限制的任务所以和组队队员一起进行任务也可以。在赛尔地下城的祭坛上放上‘魔术师的备忘录’后通过地下城到达宝箱的房间可以得到复仇之书第2册。

  为了获得这本书的解释要去克莉斯特那里。交给克莉斯特之后信鸽会给你送来 “接受【复仇之书】第二部”的任务,按照任务流程和克莉斯特对话可以得到翻译本。

  然后就是让你把复仇之书第2册交给邓肯看。到迪尔科内尔和邓肯谈话,他会说‘说不定爱琳会灭亡’,所以为了避免爱琳的灭亡必须要得到复仇之书第3册。

  根据任务内容再回到蕾拉那里谈关于复仇之书第3册的话她会让你继续等。

  11. 复仇之书,第三册

  过了一会信鸽送来了“找【复仇之书】第三部”的任务。按照任务里说的去找蕾拉的话,她会告诉你书在迪尔科内尔拉莎那里。那么就去迪尔科内尔吧。

  和拉莎谈话的话会知道那本书是休马斯在盖尔茨进行挖掘时发现的,因为自身也看不懂所以退还给了休马斯。没办法这次只好再去龙的遗迹了。

  到达遗迹之后和休马斯谈话会有把东西送给锡安的嘱托。这也是新的任务“找【复仇之书】第三部II”的任务流程之一。送完东西之后报告给休马斯,他会给你复仇之书第3册。 这次把复仇之书给克莉斯特之后她会给你翻译。

  这样就完成了复仇之书的任务。精度完第三册之后会得到新的关键字‘格拉斯贝恩’。

  12. 死亡的三勇士记忆地下城

  用‘格拉斯贝恩’和邓肯对话可以获得下一个提示。

  读完书之后把书交给邓肯获得新的关键字“破坏的化身,格拉思贝恩”。如果没有阅读清楚详细内容最好再交谈一遍。把书交给邓肯之后他会告诉你,他已把关于‘格拉斯贝恩’的书借给了班格的布莱斯。然后返回班格和布莱斯交谈可以很容易的获得书籍,并得到关键字“格拉斯贝恩的骨头”。之后用这个关键字和邓肯交谈,他会告诉你塔拉克知道的最详细。

  在晚上到希德赫雪原和塔拉克谈话,他会谈到装有自己过去的物品‘碎掉的眼镜’,因为眼镜碎了可能不能体验过去了,但如果有‘保存的魔法粉’可以和魔法粉一起给你。保存的魔法粉可以在菲奥纳地下城得到。把魔法粉送给塔拉克就可以完成任务得到记忆物品了。

  这次的记忆地下城和第一次的三勇士记忆地下城一样要3人组队才能进行。要是找到和你一起组队的两个队员后拿着记忆物品和红色女神的翅膀飞到拉比地下城吧。
  用塔拉克的眼镜形成的拉比地下城的名字不是‘拉比’而是‘阿尔贝’。共两层的阿尔贝地下城可以说是这次的核心内容。

  在阿尔贝地下城Boos房间前面会出现‘达克罗德’。 因为达克罗德会瞬间移动所以有一定的难度。而且近距离攻击和魔法攻击不会对它有任何效果,所以作为弓箭手的玛丽将成为主力。
  结束阿尔贝地下城记忆之后可以获得新的关键字。

  13. 女神的嘱托

  用新的关键字“女神的嘱托”和迪尔科内尔、敦巴伦的NPC们交谈吧。你不想听听平时和你关系好的NPC或是三勇士中的塔拉克对新的关键字会有什么反映吗?

  和邓肯、塔拉克、各个村子的牧师和老师等NPC交谈后,在登录到洛奇时又会做女神的梦。若没有出现,多登录几次之后女神就会出现,故事开始了。

  故事之后会出现新的关键字和垂饰物品。到迪尔科内尔和邓肯用关键字谈话的话可以获得新的‘去迪尔纳诺的方法’这个关键字。和塔拉克用‘去迪尔纳诺的方法’关键字谈话的话会告诉你等到找到自身的力量为止。但我们怎么能等呢?到敦巴伦和克莉斯特交谈的话会告诉你强者可以去迪尔纳诺。

  为了显示你的强大你可以到地下城打倒Boos获得头衔。如果换上打倒boss的头衔,克莉斯特还会说等级不到25级的话不能去迪尔纳诺。

  14. 玛鲁斯和稀拉的记忆地下城

  过了一会信鸽送来任务“联络邓肯”,邓肯说整理房间的时候发现了玛鲁斯的第二个记忆物品。完成任务可以得到新的关键字“坏掉的托克”。用邓肯给的坏掉的托克形成的地下城是玛鲁斯和他的妻子稀拉的记忆地下城,也就是说要两人组队才能进行。

  可以用和记忆物品一起得到的红色女神翅膀直接飞到玛斯地下城大厅。打通记忆地下城后可以获得新的关键字‘科赫尔’和NPC用‘科赫尔’关键字交谈可以获得关于科赫尔的信息。

  以后等级达到25级之后会在克莉斯特那里获得任务。是依次打倒黑色恶狼、狼人、食人魔的任务。

这个时候就可以拿到黑色通行证了,以后用“去另外一个世界的方法”的关键词就可以重复的拿通行证了~

可以拿N次.但是手中只能始终保持有一个

做到另外一个世界去的方法那一步骤的时候.会得到关键词"去另外一个世界的方法"
然后去顿城教堂找修女对话.第一次的话他叫你依次打:黑恶狼.狼人.食人魔.打完后回去报告就会给你啦.以后再用这个关键词对话她就直接会给你. 楼上这些都说得好复杂~~~

简单来说~~可以拿N次.但是手中只能始终保持有一个

做到另外一个世界去的方法那一步骤的时候.会得到关键词"去另外一个世界的方法"
然后去顿城教堂找修女对话.第一次的话他叫你依次打:黑恶狼.狼人.食人魔.打完后回去报告就会给你啦.以后再用这个关键词对话她就直接会给你.

注意:头衔要:“战胜石巨人” 你要了通行证,可以扔地上再问他要的,这样就能一次拿N个了

我要回帖

更多关于 镇定的解释 的文章

 

随机推荐