1. 以下代码输出什么结果?
alert(a) a() var a = 3 function a(){ alert(10) } a() a = 6 alert(a) a()
分析:这道题考察声明提前,将上述代码转为实际代码
var a //声明提前function a (){ //声明提前 alert(10)
}
alert(a) //输出a函数 a() //输出10 a = 3 //a赋值为3a() //报错此时a值为3已不是函数,后续不再执行
a=6
alert(a) a()
2. 以下代码输出什么结果?
for(var i =0;i<5;i++){ setTimeout(()=>{ console.log(new Date(),i) },1000) } console.log(new Date(),i)
分析:这道题考察宏任务相关知识,js为单线程,遇到 包括整体代码 script,setTimeout,setIntervcal等会创建宏任务,待主线程/与微任务(Promise,process.nextTick)完成后再去处理宏任务,将上述代码转换为实际代码
for(var i =0;i<5;i++){ } setTimeout(()=>{ console.log(new Date(),i) console.log(new Date(),i) console.log(new Date(),i) console.log(new Date(),i) },1000) console.log(new Date(),i) //当前时间,5 //当前时间+1秒,5 //当前时间+1秒,5 //当前时间+1秒,5 //当前时间+1秒,5
3. 以下代码输出什么结果?
考察引用数据类型细节
var a = new Object(); a.value = 1; b = a; //b.value=1 b.value = 2;//b.value=2;a.value=2,因为a和b指向同一块引用类型的值 alert(a.value);
4.以下代码输出什么结果?
var foo = 1; function f(){ console.log(foo); var foo = 2; console.log(foo); } f();
分析: 考察 变量作用域 与变量声明提升转换为下述代码
var foo = 1; function f(){ var foo //声明提前 有局部变量就不去使用外部的foo=1 就近原则 console.log(foo); //undefined foo = 2; console.log(foo); //2 } f();
5.函数重载
const Event = {} const addMethod = (object,name,fn)=>{ const old = object[name] object[name] = function (...args){ if(args.length == fn.length){ return fn.apply(this,args) }else{ return old.apply(this,args) } } } addMethod(Event,'add',(a,b)=>a+b) addMethod(Event,'add',(a,b,c)=>a+b+c) addMethod(Event,'add',(a,b,c,d)=>a+b+c+d) Event.add(1,2) //3 Event.add(1,2,3) //6 Event.add(1,2,3,4) //10
6.函数柯里化
const sumFuc = (fn,...arg)=>{ return (...ar)=>{ const args = [...arg,...ar] if(args.length<fn.length){ return sumFuc(fn,args) }else{ return fn(args) } } }
const sum = (a,b,c,d)=>a+b+c+d sumFuc(sum)(1)(2)(3)(4) //10 sumFuc(sum)(1,2)(3)(4) //10 sumFuc(sum)(1,2,3)(4) //10 sumFuc(sum)(1)(2)(3)(4) //10 sumFuc(sum)(1,2)(3)(4) //10 sumFuc(sum)(1,2,3)(4) //10