百度2020校招Web前端工程师笔试卷(第二批) 2024/12/17
1.FIFO为先进先出的顺序来完成页面的访问,而如果在采用先进先出页面淘汰算法的系统中,一进程在内存占3块(开始为空),页面访问序列为1、2、3、4、1、2、5、1、2、3、4、5、6。运行时会产生( 10 )次缺页中断?
解析
访问1,队列中没1,缺页一次,读入页面1;队列为1
访问2,队列中没2,缺页两次,读入页面2,队列为1,2;
访问3,队列中没3,缺页三次,读入页面3,队列为1,2,3;
访问4,队列中没4,缺页4次,读入页面4,队列为2,3,4;
访问1,队列中没1,缺页5次,读入页面1,队列为3,4,1;
访问2,队列中没2,缺页6次,读入页面2,队列为4,1,2;
访问5,队列中没5,缺页7次,读入页面5,队列为1,2,5;
访问1,不存在缺页,队列中为1,2,5;
访问2,不存在缺页,队列中为1,2,5;
访问3,队列中没3,缺页8次,读入页面3,队列中为2,5,3;
访问4,队列中没4,缺页9次,读入页面4,队列中为5,3,4;
访问5,不存在缺页,队列中为5,3,4;
访问6,队列中没6,缺页10次,队列中为3,4,6;
2.下列代码的执行结果 C
function sum(a, b) {
return a + b;
}
sum(1, "2");
A.NaN
B.TypeError
C."12"
D.3
解析
+两边有一边是字符串,那这个+就是字符串连接符,它会把其他数据类型调用String()方法转成字符串然后拼接;
3.下列代码的执行结果 0 2 2
let number = 0;
console.log(number++);
console.log(++number);
console.log(number);
4.下列代码的执行结果 C
function fn(...args) {
console.log(typeof args);
}
fn(21);
A.number"
B."array"
C."object"
D.“NaN"
解析
Rest 参数可以通过使用三个点...并在后面跟着包含剩余参数的数组名称,来将它们包含在函数定义中。args是一个数组,typeof
的返回值中没有array
,数组会被一并识别为object。
5.下列代码的执行结果 jack undefined
function Fn1(name) {
if(name){
this.name = name;
}
}
Fn1.prototype.name="jack"
let a = new Fn1();
console.log('a:', a.name);
function Fn2(name) {
this.name = name;
}
Fn2.prototype.name="jack"
let b = new Fn2();
console.log('b:', b.name);
解析
-
Fn1
构造函数:- 当你调用
new Fn1()
创建实例a
时,没有传入参数,因此name
参数为undefined
。 - 由于
if (name)
的判断条件为false
(因为name
是undefined
),因此this.name
不会被赋值。 - 访问
a.name
时,这并不会返回原型链上的值,而是实例本身的属性值。由于实例本身并没有定义name
属性(因为this.name
未被赋值),会向原型链查找。 - 在
Fn1.prototype
上,name
被设置为"jack"
,所以最终a.name
的值为"jack"
。
- 当你调用
-
Fn2
构造函数:- 当你调用
new Fn2()
创建实例b
时,同样没有提供参数,因此name
参数为undefined
。 this.name = name;
被执行,因此b.name
被设置为undefined
。- 在
Fn2.prototype
上,name
也是"jack"
,但实例b
已经有一个自己的name
属性,该属性的值是undefined
,所以访问b.name
时返回的是undefined
,而不是原型链上的值。
- 当你调用
6.下面代码大输出顺序是 2 5 1 3 4
setTimeout(() => {
console.log(1)
}, 0)
const P = new Promise((resolve, reject) => {
console.log(2)
setTimeout(() => {
resolve()
console.log(3)
}, 0)
})
P.then(() => {
console.log(4)
})
console.log(5)
解析
-
setTimeout(() => { console.log(1) }, 0)
- 这个
setTimeout
会把一个回调函数放入任务队列,等待事件循环处理。因为延迟为0ms,它会在当前执行栈清空后立刻执行,但实际在浏览器/Node.js处理时,仍然是在主线程空闲后。
- 这个
-
const P = new Promise(...)
- 创建一个新的
Promise
对象。 - 这个
Promise
的执行函数(executor function)会立即执行,因此会立即打印2
。
- 创建一个新的
-
内部分的
setTimeout(() => { resolve(); console.log(3); }, 0)
- 这个
setTimeout
同样会把一个回调放入任务队列等候执行,在当前执行栈清空后执行。 - 但它不会立即执行,因为它处于
Promise
的 executor function 内部。因此在执行栈中的当前代码都执行完毕之后,才会处理这个任务。
- 这个
-
P.then(() => { console.log(4) })
- 这里通过
then
注册了一个回调函数,这个回调函数会在Promise
被解决(resolved)后执行。因为resolve()
在下一个事件循环中被调用(在上面的setTimeout
中),所以console.log(4)
同样是排入了事件队列。
- 这里通过
-
console.log(5)
- 这个语句会立即执行,输出
5
。
- 这个语句会立即执行,输出
执行顺序总结
到现在为止,立即输出的顺序为:
2
(从Promise
executor 内部)5
(直接执行)
下一步,事件循环会开始处理队列中的任务:
-
第一次事件循环:
- 执行第一个
setTimeout
中的回调:打印1
。
- 执行第一个
-
第二次事件循环:
- 处理
Promise
内部的setTimeout
回调,首先执行resolve()
,然后执行在then
中注册的回调,打印4
。 - 同时打印
3
在resolve()
之后,因为它位于setTimeout
的回调内。
- 处理
7.有a.js和b.js两个文件,请选择b文件中代码的输出 1 {} 1 {b:2}
// a.js
let a = 1
let b = {}
setTimeout(() => {
a = 2
b.b = 2
}, 100)
module.exports = { a, b }
// b.js
const a = require('./a')
console.log(a.a)
console.log(a.b)
setTimeout(() => {
console.log(a.a)
console.log(a.b)
}, 500)
解析
module.exports
将 a
和 b
导出,因此在其他模块中可以引用它们。需要注意的是,在导出时所引用的 a
和 b
是初始值,而不是后续更新后的值。
这里就是一个深浅拷贝的问题,这里a.js中的b变量存的是一个对象的地址,由于在100ms后改变了堆中的对象属性,所以在500ms时,对于b.js中的a.b来说会引用在100ms时改变的那个对象(浅拷贝)
说白了就是值不会变,对象会发生改变。
8.请选择下面代码输出1的次数 1次
var vm = new Vue({
el: '#example',
data: {
message: 'Hello'
},
computed: {
test: function () {
console.log(1)
return this.message
}
},
created: function (){
this.message = 'World'
for (var i = 0; i < 5; i++) {
console.log(this.test)
}
}
})
解析
因为vue的computed具有缓存功能。message只更新了一次,所以test只触发一次,执行一次console.log(1)。
具体来说,computed内的test函数会被加入到message这个响应式数据的依赖视图中,当修改了message(触发了message的set)之后,test这个computed的dirty属性会被设置为true,当视图渲染的时候,发现dirty为true了,就会执行1次test函数以获取最新的值。
9.以下哪行代码添加之后不会造成父容器高度塌陷 A
A.display: flex;
B.display:inline;
C.float:left;
D.position:fixed;
10.以下这种写法不规范,但是不会报错,其在浏览器中的表现形式是<p>1<p>2</p></p>。
<p>1</p><p>2</p><p></p>
11.下面样式在网页中打开大致是什么形状
.arrow {
border-top: 10px solid #000;
border-right: 10px solid transparent;
display: inline-block;
}
<span class="arrow"></span>
解析
CSS绘制三角形—border法 - 简书
12.数字 `1` 和 `2` 被浏览器渲染出来的颜色分别是是? red red
1 2 3 4 5 6 7 8 9 10 11 12 |
|
解析
标签中使用多个class,不看这些class添加的顺序,而是看style中定义的顺序。
13.当网站对<script>标签进行过滤时,可以通过哪种方式进行绕过且有效攻击 C
A.<scrscriptipt>alert(1)<script>
B.<script>alert(1)<scrscriptipt>
C.<img src="" οnerrοr=alert(1)>
D.<scrscriptipt>alert(1)<scrscriptipt>
14.一个小根堆的序列为:{5, 12, 7, 18, 31, 13, 9},删除根节点5之后,小根堆会自动调整重新变为小根堆,小根堆的最后的叶子节点为? 13
15.关于HTTP2描述正确的是 ABC
A.采用文本格式创术数据
B.新增了多路复用
C.采用Header压缩
D.新增了连接的keep-alive功能
16.修改/home下test目录以及目录下所有文件,可以支持所有人可读可写的,以下能实现的有? AB
A.chmod 777 /home/test -R
B.chmod 666 /home/test -R
C.chmod 766 /home/test
D.chmod 765 /home/test -R
解析
要求三个数字都>=6 -R表示适用于目录以及目录下所有文件。
17.下列选项中,可能导致当前linux进程阻塞? AC
A.进程申请临界资源
B.该进程使用时间过长,进程调度程序让其他进程使用CPU
C.进程从磁盘读数据
D.时间片用完了
18.最小值
牛牛给度度熊出了一个数学题,牛牛给定数字𝑛,𝑚,𝑘,希望度度熊能找到一组非负整数𝑎,𝑏满足(𝑛−𝑎)(𝑚−𝑏)≤𝑘且𝑎+𝑏尽量小。
度度熊把这个问题交给了你,希望你能帮他解决。
#include <bits/stdc++.h>
using namespace std;
/*
思路
想要a+b最小,且满足(n-a)(m-b)<=k
那么n和m中较大的不变然后寻找
*/
int n,m,ans;
long long k;
int main() {
cin>>n>>m>>k;
if(n>m){
swap(n,m);
}
for(int i=n;i>0;i--){
if(i*m<=k) {
ans=n-i;
break;
}
}
cout<<ans;
return 0;
}
19.度度熊的工作
老板给度度熊分配了𝑛n个工作,第𝑖i个工作需要耗费𝑎𝑖单位时间,每个工作必须老板给定的限制时间𝑏𝑖前完成。
度度熊从0时刻开始工作,在同一时间度度熊手上只能做一件工作,度度熊想知道他是否能把所有工作都完成呢?
#include <bits/stdc++.h>
using namespace std;
/*
思路
单线程工作 一次只能执行一个任务,问所有任务都能否在规定时间前完成
首先按照截止时间排序,然后按照所需时间排序
*/
int T,n;
int main() {
cin>>T;
while(T--){
cin>>n;
vector<pair<int,int>> work(n);
for(int i=0;i<n;i++){
//按照截止时间,执行时间格式输入 pair默认按照first升序然后按照second升序
cin>>work[i].second>>work[i].first;
}
sort(work.begin(),work.begin()+n);
// for(int i=0;i<n;i++){
// cout<<work[i].second<<" "<<work[i].first<<endl;
// }
int current=0,flag=0; //当前时间
for(int i=0;i<n;i++){
current+=work[i].second;
if(current>=work[i].first) {
flag=1;
break;
}
}
flag==1?cout<<"No":cout<<"Yes";
cout<<endl;
}
return 0;
}