最全js面试题(JavaScript必看的10道面试题总结推荐)
最全js面试题
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面试题内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
- javascript如何转换int型(浅谈JavaScript中的parseInt的妙用)
- javascript中window对象
- javascript 自带格式化时间(JavaScript内置日期、时间格式化时间实例代码)
- javascript如何获取后台数据(JavaScript实现异步获取表单数据)
- javascript弹出菜单(Javascript实现简易导航栏)
- javascript学习参数(详解JavaScript堆栈与拷贝)
- javascript如何实现异步任务(JavaScript 中如何实现并发控制)
- vue走马灯特效(Javascript结合Vue实现对任意迷宫图片的自动寻路)
- js打印斐波那契数列(JavaScript输出斐波那契数列的实现方法)
- javascript 经典算法(JavaScript实现的七种排序算法总结推荐!)
- javascript函数的递归调用记得加上return
- ASP.NET使用JavaScriptSerializer实现序列化与反序列化
- javascript五大继承方式(原生Javascript实现继承方式及其优缺点详解)
- 百度地图获取api过程(JavaScript接入百度地图API的方法步骤)
- jupyternotebook搭建和使用(Jupyter Notebook运行JavaScript的方法)
- JavaScript 阻止超链接跳转的操作方法(多种写法)(JavaScript 阻止超链接跳转的操作方法多种写法)
- 息烽 这个村 治垃圾 有招 人人争当卫生模范(息烽这个村治垃圾)
- 今天要吃什么(今天要吃什么菜)
- 三杨之一 南杨 杨溥 安贞履节,酿醴调羹,宰相之气(三杨之一南杨杨溥)
- 今天会下雨吗(今天会下雨吗小说)
- 追连续剧,品古今联4 明代三杨,联妙诗佳(追连续剧品古今联4)
- 三杨 共辅四朝帝王,构建明帝国内阁行政圈(三杨共辅四朝帝王)
热门推荐
- dedecms增加导航内容(织梦DEDECMS中让近三天发布的文章显示红色日期或加上new字或小图片的方法)
- net微服务架构部署方式(基于Apache的支持.NET2.0的Web服务器搭建)
- js怎么防抖(JS防抖节流函数的实现与使用场景)
- sqlserver 创建数据库链接(SqlServer数据库远程连接案例教程)
- dedecms点赞功能怎么做呢(dedecms实现任意页面调用当前会员信息的方法)
- nginx如何配置多个域名访问(Nginx同一个域名配置多个项目的实现方法)
- yii2对比springboot(Yii框架实现对数据库的CURD操作示例)
- dede联动菜单样式(dede标签云如何生成不同颜色、不同大小的tag标签)
- 织梦列表页调用文章简介不显示(织梦文章系统修改专题文章列表的模板的方法)
- 阿里云ecs开放所有端口(阿里云ECS实例挂载PE盘使用chroot命令提示“I have no name”错误的解决方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9