JS面试思考:5异步和单线程
异步和单线程
我们先从几个问题来看:
- 同步和异步的区别是什么? 分别举一个同步和异步的例子
- 一个关于setTimeout的笔试题
- 前端使用异步的场景有哪些
知识点:
何时需要异步?
- 在可能发生等待的情况
- 等待过程中不能像alert一样阻塞程序运行
- 因此,所以的“等待的情况”都需要异步
前端使用异步的场景
- 定时任务:setTimeout, setInterval
- 网络请求:ajax请求、动态
<img>加载 - 事件绑定
同步和异步的区别
同步会阻塞代码运行,异步不会
其他知识补充
我们也由几个题目看过来:
- 获取 2017-06-10格式的日期
js
function formatDate(date) {
if (!date) {
date = new Date()
}
var year = date.getFullYear()
var month = date.getMonth() + 1
var date = date.getDate()
if (month < 10) {
// 强制类型转换
month = '0' + month
}
if (date < 10) {
date = '10' + date
}
// 强制类型转换
return year + '-' + month + '-' + date
}- 获取随机数,要求是长度一致的字符串格式
js
function getRandom() {
var random = Math.random()
var random = random + '0000000000'
var random = random.slice(0, 10);
console.log(random)
return random;
}- 写一个能遍历对象和数组的通用forEach函数
js
function forEach(obj, fn) {
if (obj instanceof Array) {
// 准确判断是不是数组
obj.forEach(function(item, index) {
fn(index, item)
})
} else {
// 不是数组就是对象
for (var key in obj) {
fn(key, obj[key])
}
}
}知识点
日期相关API
js
Date.now() // 获取当前时间毫秒数
var dt = new Date()
dt.getTime() // 获取毫秒数
dt.getFullYear() // 年
dt.getMonth() // 月(坑,月份从 0 - 11)
dt.getDate() // 日 (0 - 30)
dt.getHours() // 小时 (0 - 23)
dt.getMinutes() // 分钟 (0 - 59)
dt.getSeconds() // 秒 (0 - 59)Math
获取随机数 Math.random() 得到一个 0 - 1之间的小数
几个高阶函数
- forEach 遍历所有元素
- every 判断所有元素是否符合条件
- some 判断是否至少有一个元素符合条件
- sort 排序
- map 对元素重新组装,生成新数组
