前端面试-环环相扣,最为致命的面试题

316 阅读6分钟

无论什么问题最好都有自己独特的见解,才能让人眼前一亮

1.js闭包(道可道,非常道;名可名,非常名)

函数内部存在一个函数,创建闭包最常见方式,就是在一个函数内部创建另一个函数

即一个函数可以访问另一个函数的作用域

优点:可以缓存变量,下次访问直接打开 避免全局变量的污染

缺点: 回调地狱,造成内存泄漏如果不是因为某些特殊任务而需要闭包,在没有必要的情况下,

在其它函数中创建函数是不明智的,因为闭包对脚本性能具有负面影响,包括处理速度和内存消耗。

匿名函数最大的用途是创建闭包,并且还可以构建命名空间,以减少全局变量的使用。

从而使用闭包模块化代码,减少全局变量的污染。

闭包只能取得包含函数中任何变量的最后一个值,这是因为闭包所保存的是整个变量对象,

而不是某个特殊的变量。

2.js垃圾回收机制?

GC算法Garbage Collection

引用计算法(不用就清除)、标记清除计算法(没标记的销毁)、复制算法(复制)

在javascript中,如果一个对象不再被引用,那么这个对象就会被垃圾回收机制回收;

如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。

3.面向对象的理解?

面向对象是一种编程思想使用抽象方式抽象出显示数据模型

在编程中增加了代码的维护性、复用性和灵活性,

三大特征:封装(公有方法私有化),继承(实现代码的复用),多态(运行才能确定的方法)

封装:把描述一个对象的属性和行为封装成一个类,把具体的业务逻辑功能实现封装成一个方法,

其次封装的意义还有效的保护属性通过访问修饰符私有化属性(成员变量),公有化方法。

继承:实现代码的复用,所有的子类所共有的行为和属性抽取为一个父类,所有的子类继承该类可具备父类的属性和行为,

继承具有单一性和传递性。

多态:程序中定义的引用类型变量所指向的具体类型和调用的具体方法在程序编译阶段无法确定,

而是在运行期才能确定该引用类型变量指向具体哪个对象而调用在哪个类中声明的方法。

4.JS继承是什么?

继承:子类可以使用父类的所有功能,并且对这些功能进行扩展。继承的过程,就是从一般到特殊的过程。

缺点:使用类继承的方法,如果父类的构造函数中有【引用类型】,就会在子类中被所有实例共用

,因此一个子类的实例如果更改了这个引用类型,就会影响到其他子类的实例。

正式因为有了上述的缺点,才有了构造函数继承,构造函数继承的核心思想就是SuperClass.call(this,id),

直接改变this的指向,使通过this创建的属性和方法在子类中复制一份,因为是单独复制的,

所以各个实例化的子类互不影响。但是会造成内存浪费的问题

5.get\post的区别

Get 请求能缓存,Post 不能

Post 相对 Get 安全一点点,因为Get 请求都包含在 URL 里,且会被浏览器保存历史纪录,

Post 不会,但是在抓包的情况下都是一样的。

Post 可以通过 request body来传输比 Get 更多的数据,Get 没有这个技术

URL有长度限制,会影响 Get 请求,但是这个长度限制是浏览器规定的,不是 RFC 规定的

Post 支持更多的编码类型且不对数据类型限制

6.ES6新特性(提供的语法糖使复杂的操作变得简单)

①箭头函数 -- -- this指向当前对象

②在 ES6 中类(Classes)其实是原型继承的语法糖(子类不但可以继承父类,还可以拥有自己的方法)

③增强了对象字面量

④字符串插值``(。就是反引号)

⑤解构 Destructuring可在参数位置使用(解构对象json数据的解构)

⑥参数默认值

⑦扩展运算符...

⑧For..of迭代器的新类型,可以替代for..in,它返回的是值而不是keys。

⑨迭代器是一个比数组更动态的类型。

⑩生成器创建迭代器,并且比迭代器更具动态性。他们不必以相同的方式跟踪状态 并不支持 done 的概念

7.js事件委托

元素响应事件(click、keydown......)的函数委托到另一个元素;

优点

1.提高性能:每一个函数都会占用内存空间,只需添加一个事件处理程序代理所有事件,所占用的内存空间更少。

2.动态监听:使用事件委托可以自动绑定动态添加的元素,即新增的节点不需要主动添加也可以一样具有和其他元素一样的事件。

举个例子,比如一个宿舍的同学同时快递到了,一种方法就是他们都傻傻地一个个去领取,还有一种方法就是把这件事情委托给宿舍长

,让一个人出去拿好所有快递,然后再根据收件人一一分发给每个宿舍同学;

在这里,取快递就是一个事3件,每个同学指的是需要响应事件的 DOM

元素,而出去统一领取快递的宿舍长就是代理的元素,所以真正绑定事件的是这个元素,

按照收件人分发快递的过程就是在事件执行中,需要判断当前响应的事件应该匹配到被代理元素中的哪一个或者哪几个。

8.阻止冒泡(单词拼读)

w3c的方法是e.stopPropagation(),IE则是使用e.cancelBubble = true

javascript的return false只会阻止默认行为,而是用jQuery的话则既阻止默认行为又防止对象冒泡。

取消默认事件

w3c的方法是e.preventDefault(),IE则是使用e.returnValue = false;

9.setTimeout、Promise、Async/Await 的区别(看你们自己的理解)