JavaScript

  • js的基本类型有哪些?引用类型有哪些?null和undefined的区别。
  • 如何判断一个变量是Array类型?如何判断一个变量是Number类型?(都不止一种)
  • Object是引用类型嘛?引用类型和基本类型有什么区别?哪个是存在堆哪一个是存在栈上面的?
  • JS常见的dom操作api
  • 解释一下事件冒泡和事件捕获
  • 事件委托(手写例子),事件冒泡和捕获,如何阻止冒泡?如何组织默认事件?
  • 对闭包的理解?什么时候构成闭包?闭包的实现方法?闭包的优缺点?
  • this有哪些使用场景?跟C,Java中的this有什么区别?如何改变this的值?
  • call,apply,bind
  • 显示原型和隐式原型,手绘原型链,原型链是什么?为什么要有原型链
  • 创建对象的多种方式
  • 实现继承的多种方式和优缺点
  • new 一个对象具体做了什么
  • 手写Ajax,XMLHttpRequest
  • 变量提升
  • 举例说明一个匿名函数的典型用例
  • 指出JS的宿主对象和原生对象的区别,为什么扩展JS内置对象不是好的做法?有哪些内置对象和内置函数?
  • attribute和property的区别
  • document load和document DOMContentLoaded两个事件的区别
  • JS代码调试
/**
 * 下载批量文件的压缩包
 * @param urlList 组成dome [{url:‘文件路径’, name: ‘文件名称’}]
 * @param zipName 压缩文件名称
 * @param suffix 压缩的每个文件的扩展名 例如:docx
 */
 export function downFileZip(urlList, zipName, suffix) {
 if (!urlList || urlList.length < 1) {
 ElementUI.Message({
 message: ‘请选择需要下载的数据!’,
 type: ‘error’
 })
 return
 }zipName = zipName || ‘下载文件压缩包’
const zip = new JSZip()
 // cache只是用于检查数据的 并没有任何实际意义
 const cache = {}
 const promises = []
 // urlList附件url地址数组
 urlList.forEach(item => {
 // 下载文件
 const promise = getFile(item.url).then(data => {
 // 逐个添加文件 追加文件后缀
 zip.file(${item.name}.${suffix}, data, { binary: true })
 cache[item.name] = data
 })
 promises.push(promise)
 })
 // 异步队列全部完成时 执行下面代码
 Promise.all(promises).then(() => {
 // 生成二进制流
 zip.generateAsync({ type: ‘blob’ }).then(content => {
 // 利用file-saver保存文件
 saveAs(content, ${zipName}.zip)
 })
 })
 }/**
 * 批量下载文件
 * @param urlList 组成dome [‘路径’]
 */
 export function downBatchFile(urlList) {
 if (!urlList || urlList.length < 1) {
 ElementUI.Message({
 message: ‘请选择需要下载的数据!’,
 type: ‘error’
 })
 return
 }for (let i = 0; i < urlList.length; i++) {
 const hiddenIFrameID = ‘hiddenDownloader’ + i
 const iframe = document.createElement(‘iframe’)
 iframe.id = hiddenIFrameID
 iframe.style.display = ‘none’
 document.body.appendChild(iframe)
 // 直接下载,不会弹出新的页面
 iframe.src = urlList[i]
 // 销毁iframe
 setTimeout(function() {
 iframe.remove()
 }, 60 * 1000)
 }
 }