javascript 面试题
- Javascript 是单线程的,执行完当前任务才会执行下一个。
先执行同步的任务,再执行异步的任务。
异步任务:计时器(setTimeout,setInterval)、ajax 、读取文件
// 同步任务
// node里面的方法,在同步任务之后,异步任务之前执行
process.nextTick(()=>{
console.log(6)
})
// 异步任务
// node里面的方法,在同步任务之后,异步任务之后执行
setImmediate(()=>{
console.log(6)
})
-
宏任务和微任务>>>异步任务
宏任务:计时器(setTimeout,setInterval)、ajax 、读取文件
微任务:promise.then
执行顺序:
1.同步程序
2.process.nextTick
3.微任务
4.宏任务
5.setImmediate -
promise和async
let p = new Promise((resolve)=>{
// 同步任务
resolve("传给then里面的值")
}).then(res =>{
// 异步的宏任务
}).catch(err =>{
// 同步任务
})
// async 方法其实就是一个promise对象
async function fun(){
return 1
}
// 等于
function fun(){
return new Promise((resolve)=>{
return 1
})
}
fun().then((data)=>{
console.log(data);
})
- 闭包
// 闭包:函数嵌套函数,里面的函数就是闭包
function outerFun(){
let a= 10;
function innerFun(){
console.log(a);
}
return innerFun;
}
let fun = outerFun;
fun();
// 作用:封装一段代码,实现模块化
let xu =(function fun(){
let a = 10;
function add(){
return a++
}
return {add}
})()
let test = xu.add()
console.log(xu);
- 对象拷贝
let a = 10;
let b = a;
a = 20;
console.log(a,b);
// 输出 20,10
let a = {name:"小明"};
let b = a;
a.name = "小红"
console.log(a,b);
// 输出 "小红","小红"
// 原因是js的原始类型和引用类型
// 原始类型:数值,字符串,布尔,null,undefined
// 引用类型:对象
// 引用类型是存放在堆内存,通过栈内存引用
6.JSON实现深度拷贝
let stu = {
name : "小光",
age : 2
}
let stu1 = JSON.stringify(stu)
let stu2 = JSON.parse(stu1)
console.log(stu1);
// JSON.stringify(obj),将obj对象转为json格式
console.log(stu2);
// JSON.parse(obj),将json格式转为js对象
//stu2得到的就是stu的深度拷贝