JavaScript必看的10道面试题总结(推荐)

1.谁调用指向谁

例:

function foo(){ console.log("this",this); } new foo();

2.全局指向window

例:

function foo(){ console.log("this",this); } foo();

3.构造函数的this指向构造函数实例

4.call/apply/bind 强制改变this指向

5.箭头函数的this始终指向父级上下文

2.事件模型:事件委托、代理?如何让事件先冒泡后捕获

事件委托:又名事件代理。事件委托就是利用事件冒泡,就是把子元素的事件都绑定到父元素上。如果子元素阻止了事件冒泡,那么委托也就没法实现了。

三个参数:事件名、事件的方法,是捕获还是冒泡

先冒泡后捕获

给一个元素绑定两个addEventListener,其中一个第三个参数设置为false(即冒泡),另一个第三个参数设置为true(即捕获),调整它们的代码顺序,将设置为false的监听事件放在设置为true的监听事件前面即可。

3.对象和面向对象

对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性

面向对象是一种编程思想(万物皆对象)与之对应的是面向过程(类:类的继承(子类继承父类的方法和属性)、封装(核心是低耦合高内聚)、多态(重载和重写)),js是一门面向对象的语言;

* js本身就是基于面向对象构建出来的(例如:JS中有很多内置类, Array, Object, Function, String; 像Promise就是ES6中新增的一个内置类, 我们可以基于new Promise来创建一个实例, 管理异编程),

* 一般我们平时用的VUE/REACT/JQUERY也都是基于面向对象构建出来,他们都是类,平时开发的时候都是创建他们的实例来操作.

4.for···in和for···of的区别

1、推荐在循环对象属性的时候,使用for…in,在遍历数组的时候使用for…of。

2、for…in 循环出的是 key,for…of 循环出的是 value

3、for…of 不能循环普通的对象,需要通过Object.keys()来强制使用

5.查找数组重复项

查找该元素首次出现的位置和最后出现的位置下标是否相同,同时判断新数组中是否不存在该元素,如果都满足则添加进新数组中去。

ES6-set

使用ES6中的set是最简单的去重方法

var arr = [1,1,'true','true',true,true,15,15,false,false, undefined, undefined, null,null, NaN,NaN,'NaN', 0, 0, 'a', 'a',{},{}]; function arr_unique1(arr){ return [...new Set(arr)]; //或者 //return Array.from(new Set(arr)); } arr_unique1(arr); // (13)[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]

利用Map数据结构去重

function arr_unique2(arr) { let map = new Map(); let array = new Array(); // 数组用于返回结果 for (let i = 0; i < arr.length; i++) { if(map .has(arr[i])) { // 如果有该key值 map .set(arr[i], true); } else { map .set(arr[i], false); // 如果没有该key值 array .push(arr[i]); } } return array ; } console.log(arr_unique2(arr)); //(13) [1, "a", "true", true, 15, false, 1, {…}, null, NaN, NaN, "NaN", 0, "a", {…}, undefined]

利用递归去重

function arr_unique3(arr) { var array= arr; var len = array.length; array.sort(function(a,b){ //排序后更加方便去重 return a - b; }) function loop(index){ if(index >= 1){ if(array[index] === array[index-1]){ array.splice(index,1); } loop(index - 1); //递归loop,然后数组去重 } } loop(len-1); return array; } console.log(arr_unique3(arr)); //(14) [1, "a", "true", true, 15, false, 1, {…}, null, NaN, NaN, "NaN", 0, "a", {…}, undefined]

forEach + indexOf

filter+indexOf

forEach + includes

6.数组扁平化

数组扁平化就是将一个多维数组转换为一个一维数组
实现基本方式

1、对数组的每一项进行遍历。

2、判断该项是否是数组。

3、如果该项不是数组则将其直接放进新数组。

4、是数组则回到1,继续迭代。

5、当数组遍历完成,返回这个新数组。

7.iframe的优缺点有哪些

优点:

①iframe能够原封不动的把嵌入的网页展现出来;

②如果有多个网页引用iframe,那么你只需要修改iframe的内容,就可以实现调用的每一个页面内容的更改,方便快捷。

③网页如果为了统一风格,头部和版本都是一样的,就可以写成一个页面,用iframe来嵌套,可以增加代码的可重用。

④可以由iframe来解决,加载缓慢的第三方内容如图标和广告,。

缺点:

①会产生很多页面不易管理;

②iframe框架结构有时会让人感到迷惑,如果框架个数多的话,可能会出现上下、左右滚动条,会分散访问者的注意力,用户体验度差。

③代码复杂,无法被一些搜索引擎索引到,这一点很关键,现在的搜索引擎爬虫还不能很好的处理iframe中的内容,所以使用iframe会不利于搜索引擎优化。

④设备兼容性差。

⑤iframe框架页面会增加服务器的http请求,对于大型网站是不可取的。

8.函数柯里化(卡瑞化、加里化)

把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

就是只传递给函数某一部分参数来调用,返回一个新函数去处理剩下的参数(闭包)

9.垃圾回收机制

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygzwx.html