前端八股文(js篇)

一.强制类型转换规则

首先需要了解隐式转换所调用的函数。

当程序员显示调用Boolean(value),Number(value),String(value)完成的类型转换,叫做显示类型转换。

当通过new Boolean(value),new Number(value),new String(value)传入各自对应的原始类型的值,可以实现"装箱",将原始类型封装成一个对象。

其实这三个函数不仅仅是可以当做构造函数,它们可以直接当作普通的函数来使用,将任何类型的参数转换成原始类型的值:

Boolean('sdfsd') //true
Number("23") //12
String({a:24}); // "[object object]"

其实这三个函数用于类型转换的时候,调用的就是js内部的ToBoolean,ToNumber,ToString方法,从而达到显示转换的效果


二.Object.is()与操作符 "===" ,"=="的区别

==(或者!=)操纵在需要的情况下自动进行了类型转换 。===(或!==)操作不会执行如何转换。

===在比较值和类型时,可以说比==更快。

而在ES6中,Object.is()类似于 ===,但在三等号判定的基础上特别处理NaN,-0和+0,保证-0和+0不再相同,但Object.is(NaN,NaN)会返回true。


三.事件以及事件相关的兼容性问题

事件最早是在IE3和Navigator2中出现的,当时作为分担服务器运算负担的一种手段。要实现和网页的互动,就需要通过JavaScript里面的事件来实现。

每次用户与一个网页进行交互,例如点击链接,按下一个按键或者移动鼠标时,就会触发一个事件。我们的程序可以检测到这些事件,然后对此做出响应。从而形成一种交互。

当我们绑定事件时,需要遵循事件三要素

  • 事件源:是指那个元素引发的事件。比如当你点击图标的时候,会跳转到百度首页。那么这个图标就是事件源。
  • 事件:事件是指执行的动作。例如,点击鼠标,按下键盘,获得焦点。
  • 事件驱动程序:事件驱动程序即执行的结果。例如,当你点击图标的时候,会跳转到百度首页。那么跳转到百度首页就是事件的处理结果。
事件源.事件= function (){
    事件处理函数
}

 三.什么是预编译?

所谓的预编译就是:在当前作用域中,JavaScript代码执行之前,浏览器首先会默认的把所有带var和function声明的变量进行提前的声明或者定义。

另外,var声明的变量和function声明的函数在预解析的时候有区别,var声明的变量在预解析的时候只是提前的声明,function 声明的函数在预解析的时候会提前声明并且会同时定义。也就是说var声明的变量和function声明的函数的区别是在声明的同时有没有同时进行定义。


四.Promise有几种状态,Promise有什么优缺点?

Promise有三种状态:

pending,fulfilled,rejected(未决定,履行,拒绝),同一时间只能存在一种状态,且状态一旦改变就不能再变。Promise是一个构造函数,promise对象代表一项有两种可能结果(成功或失败)的任务,它还持有多个回调,出现不同结果时分别发出相应回调。

  • 初始化状态:pending
  • 当调用resolve(成功)状态:pending=> fulfilled
  • 当调用rejecte(失败)状态:pending=>rejected

Promise的优点是解决了回调地狱,缺点是代码并没有因为新方法的出现而减少,反而变得更加复杂,同时理解难度也加大,所以后面出现了async/await的异步解决放案


五.document.write和innerHTML的区别?

document.write是直接写入到页面的内容流,如果在写之前没有调用document.open,浏览器会自动调用open,每次写完关闭之后重新调用该函数,会导致页面全部重绘。

innerHTML则是DOM页面元素的一个属性,代表该元素的html内容。你可以精确到某一个具体的元素来进行更改。如果想修改document的内容,则需要修改document.documentElement.innerElement。innerHTML很多情况下都优于document.write,其原因在于不会导致页面全部重绘。


六.call,apply,bind的区别?

call和apply的功能相同,区别在于传承的方式不一样:

  • fn.call(obj,arg1,arg2,...)调用一个函数,具有一个指定的this值和分别地提供的参数(参数的列表)
  • fn.apply(obj,[argsArray])调用一个函数,具有一个指定的this值,以及作为一个数组(或类数组对象)提供的参数。

bind和call/apply有一个很重要的区别,一个函数被call/apply的时候,会直接调用,但是bind会创建一个新函数。当这个新函数被调用时,bind()的第一参数将作为它运行时的this,之后的一序列参数将会在传递的实参前传入作为它的参数。


七.this的指向哪几种?

总结起来,this的指向规律有如下几条:

  • 在函数体中,非显式或隐式地简单调用函数时,在严格模式下,函数内的this会被this绑定到undefined上,在非严格模式下则会被绑定到全局对象window/global上。
  • 一般使用new方法调用构造函数时,构造函数内的this会被绑定到新创建的对象上。
  • 一般通过call/apply/bind方法显示调用函数时,函数体内的this会被绑定到指定参数的对象上。
  • 一般通过上下文对象调用函数时,函数体内的this会被绑定到该对象上。
  • 在箭头函数中,this的指向是由外层(函数或全局)作用域来决定的。

八.什么是js的闭包?有什么作用

一个函数和对其周围状态的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在JavaScript中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。

闭包的用处:

  • 匿名自执行函数
  • 结果缓存
  • 封装
  • 实现类和继承

九.ES6箭头函数的特性

1.更简洁的语法,例如:

  • 只有一个形参就不需要用括号括起来
  • 如果函数体只有一行,就不需要放到一个块中
  • 如果return语句是函数体内唯一的语句,就不需要return关键字

2.箭头函数没有自己的this,arguments,super

3.箭头函数的this只会从自己的作用域链上一层继承this


十.JS的作用域类型

在JavaScript里面,作用域一共有4种:全局作用域,局部作用域,函数作用域以及eval作用域。

  1. 全局作用域:这是默认的代码运行环境,一旦代码被载入,引擎最先进入的就是这个环境。
  2. 局部作用域:当使用let或者const声明变量时,这些变量在一对花括号中存在局部作用域,只能够在花括号内部进行访问使用。
  3. 函数作用域:当进入到一个函数的时候,就会产生一个函数作用域。函数作用域里面所声明的变量只在函数中提供访问使用。
  4. eval作用域:当调用eval()函数的时候,就会产生一个eval作用域。

你可能感兴趣的:(八股文,前端,javascript,开发语言)