JS面试题真题
1.异步和单线程
题目
-
同步和异步的区别是什么?
-
手写Promise加载一张图片
-
前端使用异步的场景有哪些?
-
场景题:1,2,3,4,5以什么顺序打印出来?
//setTimeout笔试题 console.log(1) setTimeout(function(){ console.log(2) },1000) console.log(3) setTimeout(function(){ console.log(4) },0); console.log(5); //1,3,5,4,2
知识点
-
单线程和异步
-
JS是单线程语言,只能同时做一件事儿(产生异步的原因)
-
浏览器和node.js已经支持JS启动进程,如web worker
-
JS 和DOM渲染共用一个线程,因为JS可修改DOM结构
-
遇到等待(网络请求,定时任务)不能卡住,所以需要异步
-
异步回调callback函数形式
// 异步会执行(callback 回调函数) (setTiemout里面的) console.log(100) setTimeout(() => { console.log(200) }, 1000)//不会卡在这里,会先向下执行,执行完毕后再后执行回调函数 console.log(300) console.log(400)
// 同步 console.log(100) alert(200)//卡在这里,确认在继续执行 console.log(300)
-
基于JS是单线程语言的本质,异步不会阻塞代码
-
同步会阻塞代码的执
-
-
异步应用场景(等待的情况)
-
网络请求,如ajax和图片加载 这时cpu是空闲的,所以要有异步,这样cpu才能饱和工作
//ajax console.log('start'); $.get('./data1.json',function(data1){ console.log(data1); }) console.log('end'); /* 1.打印start. 2.执行网络请求(耗费时间),跳过继续向下执行 3.打印end 4.打印完end,网络请求什么时候完毕,什么时候就执行回调函数,返回请求数据 */
//图片加载 console.log('start'); let img = document.createElement('img'); img.onload = function(){//onload 事件会在页面或图像加载完成后立即发生 console.log('loaded'); } //加载图片 img.src = '/xxx.png'; console.log('end'); //这里的onload是另一种形式的回调函数,程序执行到img.src进行加载图片,会花费一些时间,此时程序不会等待,而是会继续向下执行,打印end,什么时候图片加载完成,什么时候回调用onload函数,打印’onload‘
-
定时任务,如setTimeout,这时cpu是空闲的,所以要有异步,这样cpu才能饱和工作
//setTimeout setTimeout(() => { console.log(200) }, 1000)//不会卡在这里,会先向下执行,执行完毕后再掉执行回调函数 console.log(300) //setInterval console.log(100) setInterval(function(){ console.log(200) },1000) console.log(300)
-
-
问题解答:
-
异步同步的区别是什么?
- 基于JS是单线程语言
- 异步不会阻塞代码执行
- 同步会阻塞代码执行
-
手写用Promise加载一张图片
const url1 = 'https://img1.sycdn.imooc.com/5968a7860001fed401000100-140-140.jpg'; const url2 = 'https://img3.sycdn.imooc.com/szimg/5eddd7aa09cfdb1c12000676-360-202.png' function loadImg(src) { //pending return new Promise((resolve,reject)=>{ const img = document.createElement('img'); img.onload = ()=>{//onload也是一种回调形式 resolve(img);//resolved } img.onerror=()=>{ const err = new Error(`图片加载失败${src}`); reject(err);//rejected } img.src = src; }) } //1.加载一张图片 /* loadImg(url).then(img=>{ console.log(img.width); return img; }).then(img=>{ console.log(img.height); }).catch(ex=>console.error(ex)) */ //2.加载两张图片 loadImg(url1).then(img1=>{ console.log(img1.width);//普通对象 return img1; }).then(img1=>{ console.log(img1.height); return loadImg(url2);//promise实例 }).then(img2=>{ console.log(img2.width); return img2; }).then(img2=>{ console.log(img2.height) }).catch(ex=>console.error(ex))
-
-
前端使用异步的场景有哪些
- 网络请求,如ajax,图片加载
- 定时任务,如setTimeout
JS基础总结
-
内容回顾
- 变量的类型和计算
- 原型和原型链
- 作用域和闭包
- 异步和单线程
-
回顾题目
- typeof能判断哪些类型
- 何时使用=何时使用
- 值类型和引用类型的区别
- 手写深拷贝
-
回顾知识点
- 值类型vs引用类型,堆栈模型,深拷贝
- typeof 运算符作用
- 类型转化
-
原型和原型链的题目
-
如何准确判断一个变量是不是一个数组?
- intanceof
-
手写一个jQuery,考虑插件和扩展性
-
class的原型本质,怎么理解
-
-
原型和原型链--知识点
- class和继承,结合手写jQuery的实例来理解
- instanceof
- 原型和原型链:图示和执行规则
-
闭包和作用域-题目
- this的不同应用长江,如何取值
- 手写bind函数
- 实际开发中闭包的应用场景,举例说明
- 坑:创建10个a标签,点击……
-
作用域和闭包--知识点
- 作用域和自由变量
- 闭包:两种常见形式&自由变量查找规则
- this
-
异步和单线程-题目
- 同步和异步的区别是什么?
- 手写promise加载一张图片
- 前端使用异步的场景有哪些
- setTimeout定时器的场景题
-
异步单线程-知识点
- 单线程和异步,异步和同步的区别
- 前端异步的应用场景:网络请求&定时任务
- Promise解决callback hell