一次失败的笔试以及背后的思考
时间: 2020/9/19 (前端笔试)
我前去参加某公司笔试,满心以为能通过到面试,没想到几道选择题之后就折戟沉沙了(后悔没准备选择题,倒是准备了面试的题)。。。
没有对答案,只想尽力回想做过的几道那时没想明白的题目
1、选择题:
display: none; 会引起重绘还是重排?
visibility: hidden; 会引起重绘还是重排?
答案:display:none;会引起重排,visibility:hidden会引起重绘
基本知识:
1、重绘与重排都是浏览器在页面元素改变时会进行的操作。一般来说,浏览器渲染器进程会进行如下操作:
-
生成DOM树 、CSS树(Parse HTML)
-
DOM树与CSS树关联生成渲染树(RenderObject Tree),渲染树生成RenderLayer Tree
-
由渲染树计算布局(RenderLayout)
-
转化为屏幕对应的像素,生成绘制记录表(Paint)
-
对某些RenderLayout进行处理,生成合成层(Composite)
生成合成层的标准:
- 3D 或透视变换(perspective transform) CSS 属性
- 使用加速视频解码的 元素 拥有 3D
- (WebGL) 上下文或加速的 2D 上下文的 元素
- 混合插件(如 Flash)
- 对自己的 opacity 做 CSS动画或使用一个动画变换的元素
- 拥有加速 CSS 过滤器的元素
- 元素有一个包含复合层的后代节点(换句话说,就是一个元素拥有一个子元素,该子元素在自己的层里)
- 元素有一个z-index较低且包含一个复合层的兄弟元素(换句话说就是该元素在复合层上面渲染)
注意:使用will-change CSS属性可以使chrome浏览器提前进行优化,如will-change:transform
2、 回流/重排(reflow)、重绘(repaint)
1、当浏览器发现某个部分发生了点变化影响了布局,需要倒回去重新渲染,这个回退的过程叫 reflow。
2、改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性时,屏幕的一部分要重画,但是元素的几何尺寸没有变。
3、重排的步骤就包括了重绘。
3、visibility:hidden; display: none;
1、visibility:hidden;元素被隐藏,当其布局的影响仍然存在(在RenderObject Tree上表现为一个空框)
2、display:none;元素被隐藏,当其布局的影响不存在(不存在在RenderObject Tree上)
2、选择题:
链接:https://www.nowcoder.com/questionTerminal/b09580a48ec044ef919264643b0b2486?source=relative
来源:牛客网关于HTML语义化,以下哪个说法是正确的? 答案:D
语义化的HTML有利于机器的阅读,如PDA手持设备、搜索引擎爬虫;但不利于人的阅读
Table 属于过时的标签,遇到数据列表时,需尽量使用 div 来模拟表格
语义化是HTML5带来的新概念,此前版本的HTML无法做到语义化
header、article、address都属于语义化明确的标签
首先,我们可以排除A和B😄,
接着HTML5是强调语义化,并不代表语义化是HTML5开创的(例如:<address>
就是HTML4.0的提案)(不做这道题我还真不知道😓)
header、article是人尽皆知的语义化标签了,<address>
是表示地址信息,默认表现与<i></i><em></em>
一致
3、选择题:
以下哪些选项可以将集合A转化为数组?
Array.from(A)
[].slice.apply(A)
[…A]
[].map.call(A, o => o)
正确答案(牛客):A C
首先,我先讨论一下题目中的集合A是什么鬼???这是这个题目的败笔,要知道诸如Java,Python这些语言都将集合(collection)解释为容器类,它的子类有Set、Map、List这些数据结构。回到题目,这个集合A指的到底是什么数据结构呢?很抱歉,JavaScript也不存在对"集合"这个名词的解释, MDN上有indexed Collections(Array)、keyed Collections(Map、Set)。
在牛客上有人说是,像‘123456’这样的数字字符串(不可能),有人说是Set(有点合理)
实在不明白这个‘集合A’为何物,一个接近的解释是‘可迭代对象(iterable)’
如果将集合A看成可迭代对象的话,来看选项:(告别这个沙雕问题吧/(ㄒoㄒ)/~~)
A、Array.from() 可以传入字符串、伪数组、可迭代对象,创建一个新的,浅拷贝的数组实例。
B、[].slice.apply(A) 可以传入字符串、数组,创建一个新的,浅拷贝的数组实例。
C、[...A] 可以传入字符串、伪数组、可迭代对象,创建一个新的,浅拷贝的数组实例。这里是数组的解构用法
D、[].map.call(A, o => o)可以传入字符串、数组,创建一个新的,浅拷贝的数组实例。
更正:后来觉得应该是出题人将Set翻译成了"集合"了,感觉解释的通,关键名字就算翻译了也该标注一下吧。
万恶的中文翻译,以后见一个怼一个。
4、算法题
算法题一直都是弱项,更不应该急躁才对
这个算法题考的是 数组末尾加一(其实就是简单的处理逻辑而已),注意进位以及如[9,9,9,9]这类数组可能会多出一位的可能。
let arr = [9,9,9,9];
function addOne(arr) {
let res = [];
let jinWei = 0;
// 末位自动加一
if (arr[arr.length - 1] < 9) {
res.push(arr[arr.length - 1] + 1);
} else{
jinWei = 1;
res.push(0)
}
// 其余位数处理
for (let i = arr.length - 2; i >= 0; i--) {
if (arr[i] + jinWei <= 9) {
res.push(arr[i] + jinWei);
jinWei = 0;
} else{
jinWei = 1;
res.push(0)
}
}
// 多出一位
if(jinWei) {
res.push(1)
}
return res.reverse()
}
console.log(addOne(arr))