JavaScript必看的10道面试题总结(推荐)
作者:一只燕仔
1.this指向
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.垃圾回收机制
浏览器的 Javascript 具有自动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存。其原理是:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存。但是这个过程不是实时的,因为其开销比较大并且GC时停止响应其他操作,所以垃圾回收器会按照固定的时间间隔周期性的执行
10.window的onload事件和domcontentloaded
window.onload:
当一个资源及其依赖资源已完成加载时,将触发onload事件。
document.onDOMContentLoaded:
当初始的HTML文档被完全加载和解析完成之后,DOMContentLoaded事件被触发,而无需等待样式表、图像和子框架的完成加载。
区别:
①onload事件是DOM事件,onDOMContentLoaded是HTML5事件。
②onload事件会被样式表、图像和子框架阻塞,而onDOMContentLoaded不会。
③当加载的脚本内容并不包含立即执行DOM操作时,使用onDOMContentLoaded事件是个更好的选择,会比onload事件执行时间更早。
总结
到此这篇关于JavaScript必看的10道面试题的文章就介绍到这了,更多相关JavaScript面试题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!