1. JS由那三部分组成?
- ECMASript
- 文档对象模型(DOM)
- 浏览器对象模型(BOM)
2. 操作数组的方法有那些?
- 高阶函数:map、filter、forEach、reduce、find、findIndex、every、some、
- push、unshift、shift、pop、splice、slice、join、concat、fill、indexOf、includes、reduceRight、reverse、sort、
会改变原数组的方法:push、unshift、shift、pop、splice、join、reverse、sort
3. JS对数据类型的检测方法有哪些?
- typeof:只能判断出基本数据类型,不能区分引用类型。
- instanceof:只能判断出引用类型,不能区分基本类型。
原理:判断实例对象的__proto__属性是否和构造函数的prototype属性指向同一个原型对象。如果没找到,则会在原型链上继续查找。 - Object.prototype.toString:最佳的方法。
4. 说一下闭包,以及特点。
- 如何产生闭包?
-函数嵌套,内部函数引用了外部函数的(变量或函数)时,就产生了闭包
- 闭包的作用?
使用闭包函数执行完成后,内部函数引用外部函数的数据(变量或函数)在存在内存中
使函数外部可以操作到函数内部的数据
- 闭包的生命周期
1. 产生: 在内部嵌套函数定义执行(不是真实执行)完成时就产生了(不是在调用)
2. 死亡: 在内部嵌套函数成为垃圾对象时
function fn1() {
// 程序执行到此处时, 先函数提升然后变量提升(内部函数对象创建) 闭包出现
// 因为有 var a = undefinedvar a = 2function fun() {console.log(++a)}return fun
}
var f = fn1()
f() // 3
f() // 4
// 此时没有死亡
f = null // 此时内部函数无引用指向 死亡
- 闭包的应用-定义js模块
- 具有特定功能的js模块
- 将所有的数据和方法都封装到一个函数的内部(私有的)
- 只向外部暴露一个包含n个方法的对象或函数
- 模块的使用者,只需要通过模块导出的对象调用方法来实现对应的功能。
/*方法一*/
function my_module() {var msg = 'songRuiXue'function doSomething() {console.log('doSomething' + msg.toUpperCase()) // msg: 全部大写}function doOtherthing() {console.log('doOtherthing' + msg.toLowerCase()) // msg: 全部小写}return {doSomething: doSomething,doOtherthing: doOtherthing}
}
/*方法二*/
(function(window) {var msg = 'songRuiXue'function doSomething() {console.log('doSomething' + msg.toUpperCase()) // msg: 全部大写}function doOtherthing() {console.log('doOtherthing' + msg.toLowerCase()) // msg: 全部小写}window.obj = {doSomething: doSomething,doOtherthing: doOtherthing}
})(window)调用
/*方法一*/
var obj = my_module()
obj.doSomething()
obj.doOtherthing()/*方法二*/
obj.doSomething()
obj.doOtherthing()
5. 事件冒泡、事件捕获及事件代理(事件委托)?
事件流(event flow)过程:事件捕获 -> 目标阶段 -> 事件冒泡
阻止冒泡:event.stopPropagation() (停止传播)
阻止默认行为:event.preventDefault() return false
return false 不仅阻止了事件往上冒泡,而且阻止了事件本身(默认事件)。event.stopPropagation()则只阻止事件往上冒泡,不阻止事件本身。
事件冒泡、事件捕获及事件代理
6. 说一下for…in 和 for…of的区别?
for...of遍历获取的是对象的键值,for...in遍历获取的是对象的键名
for...of只遍历当前对象不会去遍历原型链,for...in会遍历对象的整个原型链,性能差。
对于数组的遍历,for...of只返回数组下标对应的属性值。for...in会返回数组中所有可枚举的属性(包括原型链上可枚举的属性)。
总结:for...in主要用来遍历对象,不适合遍历数组。 for....of循环可以用来遍历数组、类数组对象、字符串、Set、Map以及Generator对象
7. 给 a b c 三个请求,希望 c 在 a b 获取结果之后再请求。
1. Promise.all
2. 使用数组实现
const fs = require('fs')const arr = []
function fn (data) {arr.push(data)if (arr.length === 2) {console.log(arr)// 在此时可以执行 c 的逻辑}
}
fs.readFile('./a.text', 'utf-8', (err, data) => {fn(data)
})
fs.readFile('./b.text', 'utf-8', (err, data) => {fn(data)
})