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.未完待续。。

原文地址:https://www.cnblogs.com/YiNongLee/p/9344878.html