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

