Skip to content

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 对元素重新组装,生成新数组

共 20 个模块,1301 篇 Markdown 文档。