js面试题
来源:互联网 发布:mac桌面壁纸文件夹 编辑:程序博客网 时间:2024/06/14 05:47
1.前言
对于一个web前端来说,面试的时候,难免会遇到javascript的面试题。就我自己而言。有几道面试题,有些是我面试遇到的,有些是在网上看到的,但是都印象深刻。今天就来简单分析一下我遇到的,印象深刻的一些面试题!主要目的希望能让小伙伴学到一些东西,如过以后遇到类似的情况,就记得不要掉坑了!
2.预解析
预解析:在当前作用域下,js运行之前,会把带有var和function关键字的事先声明,但不会赋值(个人见解)
对预解析印象深刻,并不是因为难,而是要细心,稍微一粗心,答案就写错了!我遇到预解析的题目不止一道,有两道我现在还能记住,我说下!
2-1.预解析1
alert(a)a();var a=3;function a(){ alert(10)} alert(a)a=6;a(); ------------分割线------------------alert(a)a();var a=3;var a=function(){ alert(10)} alert(a)a=6;a();
看到这个代码,当时答错了。后来请教了朋友,然后自己再理解下,就理顺了!
考点其实就两个,第一变量声明提前,第二函数声明优先于变量声明!
下面我简单分析一下,
第一部分运行结果:
1.函数声明优先于变量声明,所以,刚开始,a就是function a(){alert(10)}
,就会看到这个函数。
2.a()
,执行函数,就是出现alert(10)
3.执行了var a=3;
所以alert(a)
就是显示3
4.由于a
不是一个函数了,所以往下在执行到a()
的时候, 报错。
第二部分运行结果:
1.underfind
2.报错
在之前说过,预解析是把带有var
和function
关键字的事先声明,但不会赋值。所以一开始是underfind
,然后报错是因为执行到a()
的时候,a
并不是一个函数。
//函数表达式,和变量声明同等var a=function(){ alert(10)} //函数声明,优于变量声明 function a(){ alert(10)}
2-2.预解析和作用域
var a=0;function aa(){ alert(a) a=3}//结果是什么都没发生,因为要执行aa函数才会执行alert(0)------------分割线1------------------var a=0;function aa(){ alert(a) var a=3}aa();//underfind 在aa函数里面,有var a=3,那么在aa作用域里面,就是把a这个变量声明提前,但是不会赋值,所以是underfind------------分割线2------------------var a=0;function aa(a){ alert(a) var a=3}aa(5)alert(a)//5,0 在函数体内,参数a的优先级高于变量a------------分割线3------------------var a=0;function aa(a){ alert(a) a=3}aa(5)alert(a)//5,0 在函数体内,执行alert(a)和a=3,修改的的并不是全局变量a,而是参数a------------分割线4------------------var a=0;function aa(a){ alert(a) var a=3 alert(a)}aa(5)//5,3//这个我也有点不理解,请教网上的说法,有两个答案(小伙伴如果知道怎么理解,欢迎在评论上指点)//1.参数优先级高于变量声明,所以 变量a的声明其实被忽略了,此时相当于//var a=0;//function aa(a){// var a=5;// alert(a)// a=3// alert(a)//}//aa(5)//2.形参和局部变量优先级一样,此时相当于//var a=0;//function aa(a){// var a; 先声明// a=5 由于形参和变量名称一样,覆盖了!// alert(a)// a=3// alert(a)//}//aa(5)------------分割线5------------------var a=0;function aa(a){ alert(a) a=3 alert(a)}aa()alert(a)//underfind 3 0 //首先,参数优先级高于全局变量,由于没传参数,所以是underfind//a=3,实际上修改的时形参a的值,并不是全局变量a,往下alert(a)也是形参a//最后的alert(a),你懂的
3.循环与递归
3-1.费波纳茨数组
这个不多说了,很简单,但是很经典。就是当前项等于前两项的和
var arr=[];for(var i=0;i<10;i++ ){ i<=1?arr.push(1):arr.push(arr[i-1]+arr[i-2]);}console.log(arr)
3-2.数据排列
比如 123454321 23456765432
这个怎么做呢?当时我的做法的分两步写,先展示前面,再展示后面
代码是
//01234543210//先展示前面的 01234//n:开始的数字 m:结束的数字function num1(n,m){ for(var i=n;i<m;i++){ //再展示后面的 543210 console.log(i); if(i===m-1){ num2(n,m) } }}function num2(n,m){ for(var i=m;i>=n;i--){ console.log(i) }}num1(2,5) //2345432
这样代码太多了,后来研究了这种
function num(n,m){ console.log(n); if(n<m){ num(n+1,m); console.log(n); }}num(2,5) //2345432
解释如下
1.首先执行num(2,5),就是console.log(2); -> num(3,5); -> console.log(2); //执行num(3,5); 就是是相当于 console.log(3); -> num(4,5); -> console.log(3); 下面以此类推console.log(2); -> console.log(3); -> num(4,5); -> console.log(3); -> console.log(2); 然后就是console.log(2); -> console.log(3); -> console.log(4); -> num(5,5); -> console.log(4); -> console.log(3); -> console.log(2);最后就是console.log(2); -> console.log(3); -> console.log(4); -> console.log(5); -> console.log(4); -> console.log(3); -> console.log(2);
4.其它
4-1
function foo1(){ return { bar: "hello" };}function foo2(){ return { bar: "hello" };}var a=foo1();var b=foo2();console.log(a) //Object {bar: "hello"}console.log(b) //underfind//仔细看就知道了
4-2
网上看到的题目,我自己改造下 80%应聘者都不及格的JS面试题
for (var i = 0; i < 5; i++) { console.log(i);}console.log(i);//这个大家应该很快就知道了,012345for (var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 1000);}console.log(i);//这个大家就要小心一点了,答案是5 55555//在setTimeout执行之前,for循环早就执行完了,i的值早已经是5了,所以一开始是执行,最后面的console.log(i);//在for循环的时候一下子自定义5个setTimeout,大概一秒后,就是输出55555for (var i = 0; i < 5; i++) { (function(j) { // j = i setTimeout(function() { console.log(j); }, 1000); })(i);}console.log(i); //这里的解析和上面基本一样,只是用闭包来记录每一次循环的i,//所以答案是5 01234var output = function (i) { setTimeout(function() { console.log(i); }, 1000);};for (var i = 0; i < 5; i++) { output(i); // 这里传过去的 i 值被复制了}console.log(i);//这里的解析和上面基本一样,把i当参数传进output,记录每一次循环的i,//所以答案是5 01234for (let i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 1000);}console.log(i);//结果是 报错 01234 //注意i是用let定义的,不是var
- js面试题
- js面试题
- JS面试题
- js面试题
- 收集js面试题
- JS 面试题大全
- js经典面试题
- js面试题
- 一道JS面试题
- Js面试题
- 一道JS 面试题
- js 面试题
- 一道JS面试题
- JS面试题集锦
- Js企业面试题
- js面试题
- js 面试题
- js面试题
- JavaScript中的小技巧和注意点(二)
- Windows下编译libxls32位和64位链接库
- day04_元素案例
- SAA3010T红外解码
- 设置Tomcat的UTF-8编码
- js面试题
- js 各种事件 如:点击事件、失去焦点、键盘事件等
- 进程的状态转换、进程间通信的方式
- SSM 框架搭建
- Inception v1 —v2 —v3 —v4
- Kotlin系列视频教程
- shell知识点回顾一
- 终于搞懂了shell bash cmd...
- IntelliJ Idea 2017 注册码 免费激活方法