js面试题及分析
1.var fn=function a(){
alert(a);
};
fn();//function a(){alert(a);}
alert(a);//a is not defined;
alert(a);
};
fn();//function a(){alert(a);}
alert(a);//a is not defined;
**************
考的是函数表达式和函数声明的区别,表达式不会提前,只会在赋值时候声明,由赋值符左操作数调用执行。**************
2.var a=1;
function fn(){
a=b=2;
}
fn();
alert(a);//2
alert(b);//2
function fn(){
a=b=2;
}
fn();
alert(a);//2
alert(b);//2
**************
a还好就是函数内直接改变全局变量的值,主要是b,
如果严格模式会出错,否则就是相当于没有var的声明的b直接定义,为全局变量。
**************
3.function a(){
console.log("function a");
}
var a;
console.log(a);//function a(){ console.log("function a"); }
console.log("function a");
}
var a;
console.log(a);//function a(){ console.log("function a"); }
**************
变量声明提前,var a;提到最前面,然后声明了函数a,所以就是输出该函数。
**************
4.function test(){
var a=1;
setTimeout(function(){
alert(a);
a=3;
},0);
a=2;
setTimeout(function(){
alert(a);
a=4;
},3000);
}
test();
alert(0);
var a=1;
setTimeout(function(){
alert(a);
a=3;
},0);
a=2;
setTimeout(function(){
alert(a);
a=4;
},3000);
}
test();
alert(0);
**************
结果是:0 ,2, 3
当调用test的时候里面的alert都是在时间间隔内部,所以会先放到一个时间间隔的队列,之后会接在js执行队列的末尾,所以js正常执行顺序的程序先执行。如果test内部有js的顺序执行的内容也会按顺序先执行。
**************
5.var a=1;
obj={b:2};
function fn(){}
fn.c=3;
function change(x,y,z){
x=4;
y.b=5;
z.c=6;
return z;
}
change(a,obj,fn);
console.log(a+obj.b+fn.c);//12
obj={b:2};
function fn(){}
fn.c=3;
function change(x,y,z){
x=4;
y.b=5;
z.c=6;
return z;
}
change(a,obj,fn);
console.log(a+obj.b+fn.c);//12
**************
change函数的三个参数x,y, z 分别对应的是a ,obj ,fn, a是基本数据类型,所以x相当于1传入,基本类型不会改变,obj和fn都是引用类型,所以传入的是引用,则对其属性改变,引用就会改变,所以就是1+5+6=12的结果。
**************
6.js判断对象类型的方法和优缺点
**typeof 不能细分出具体是什么object,基本类型可以。
**instanceof 必须实例才可以判断,基本类型不可以。
**Object.prototype.toString.call();可以较详细的判断出来,null和undefined分不出来(Null),NaN和Number分不出来(Number),[object,Number/Boolean/String/Object/Array/Function/Date/Null
]