2018 CVTE 前端校招笔试题整理
昨天晚上(7.20)做了CVTE的前端笔试,总共三十道题,28道多选题,2道编程题 。做完了之后觉得自己基础还是不够扎实,故在此整理出答案,让自己能从中得到收获,同时给日后的同学一些参考。
首先说一下两道肥肠简单的编程题:
1.请实现这样一个函数,输入参数为一个长度为2n的整数数组,以两个整数一组的方式将数据分组,并使每组数组最小值相加为最大,输出这个最大值。
输入[1,4,3, 2],输出为4
输入[1,5,7,9, 4, 12],输出为15
思路:把数组按大小排序然后相邻两项分为一组,取每组较小的一个数相加即可。
function arrApart(arr){ arr.sort( function(a,b){return a-b} ); var len = arr.length; var result = 0; for(i = 0 ; i < len ; i=i+2){ result += arr[i]; console.log(arr[i]); } return result } console.log("result: "+arrApart([3,1,4,7,2,12,6,8])) //result: 18
2. 用flex实现一个三栏布局,左右定宽,中间自适应。这个就很简单了。
<style> body{ margin: 0; padding: 0; } .box{ display: flex; } .left{ width: 200px; height:400px; background: red; } .middle{ flex-grow:1; height:400px; background: yellow; } .right{ width: 120px; height:400px; background: blue; } </style> </head> <body> <div class="box"> <div class="left"></div> <div class="middle"></div> <div class="right"></div> </div> </body>
下面是部分小题:
1. 以下代码输出啥?
for(var i={j:0};i.j< 5;i.j++){ (function(i){ setTimeout(function(){console.log(i.j)},0); })(JSON.parse(JSON.stringify(i))); }
输出啥?//0,1,2,3,4
for循环体内创建了一个自执行的匿名函数,立即把每一个 i 以 JSON.parse(JSON.stringify(i)) 处理之后按值传递给匿名函数的参数。这里的每个i是个对象,JSON.stringify()是从一个对象中解析出字符串,即JSON.stringify(i) === '{"j": 0 }',而JSON.parse()是从一个字符串中解析出json对象,即JSON.parse('{"j": 0 }') === { j : 0 }, 一波操作之后传的其实还是i,然后再一个个把i.j 的值打印出来,结果是0,1,2,3,4
2. 已知一算术中缀表达式为A-(B+C)*D+F/G ,则可算出后缀表达式为( )
所谓前缀、中缀、后缀表达式,它们都是对表达式的记法,因此也被称为前缀记法(波兰式)、中缀记法和后缀记法(逆波兰式)。它们之间的区别在于运算符相对与操作数的位置不同:前缀表达式的运算符位于与其相关的操作数之前;中缀和后缀同理。
变换步骤如下:a. 先按优先级给每个表达式加括号: (A-(((B+C)*D)+(F/G))) b. 将每个括号内的运算符丢到括号后面:((A-((B+C)*D))+(F/G)) c. 去掉括号:ABC+D*-FG/+ (中缀变前缀就是把运算符丢到括号前面)
3. Web Workers:Web Worker是HTML5提供的一个JavaScript多线程解决方案,其实就是在Javascript单线程执行的基础上,开启一个子线程,进行程序处理,而不影响主线程的执行,当子线程执行完毕之后再回到主线程上,在这个过程中并不影响主线程的执行过程。但是子线程完全受主线程的控制,切子线程不能操作DOM,只有主线程可以操作DOM,关于web workers的使用可以参考这篇文:https://segmentfault.com/a/1190000012528806
4. 生成器函数Generator :https://www.cnblogs.com/wangfupeng1988/p/6532713.html
5. 以下代码输出啥?
var Func = () => console.log('a'); setTimeout(Func,0); console.log('change'); Func = () => console.log('another a');
依次输出:change、a 。原因:【JS运行机制】JS代码先执行同步代码,将第二行的setTimeout中的异步任务放进异步队列,等待同步任务执行完了再推入event loop执行,故先输出第三行的“change”,而后为何输出“a”而不是“another a”呢? 我理解的是,第二行放入异步队列里的是包括Func的函数体的要执行的代码,切断了Func变量和它的引用关系,所以即使第四行已经改变了Func函数的函数体也不会对异步队列中的代码产生影响。(纯个人理解,如果有误烦请指出)
6.
var setPerson = function(person) { person.name = 'kevin'; person = {name:'rick'};} var person = {name:'alan'}; setPerson(person); alert(person.name); //"kevin"
在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部;当在函数内部重写引用类型的形参时,这个变量引用的就是一个局部对象了。而这个局部对象会在函数执行完毕后立即被销毁。
7.未完待续。。