网易2020前端笔试提前批试题解析
第一题
解析:题目讲的是两个节点的二叉树,所以只是一个父节点和一个子节点的二叉树。如图所示
第二题
HTTP报文分为请求报文和响应报文,但是并不是每个服务器都支持GET\HEAD\PUT等7种请求方法,而且应该是GET,POST,DELETE,PUT,OPTIONS
第三题
题目很明显的暗示插入排序,我脑子瓦特了。选择是选每次遍历最小的,放进去。
第四题
和=的区别:
- 出现==:
- 我们可以将=看作的严格模式,当的时候如果数据类型相同那么就会转换成=;如果数据类型不同那么会自动的进行一次类型转换,转换成相同的类型后进行比较。
- 出现===:出现三个等号的时候,首先判断的是类型是否相等,如果不相等就会返回false
- valueOf方法和toString方法默认调用toString方法
- 这是为什么呢,我看的有些博客直接说默认调用toString并没有说明原理。其实是这样的,我们看下面的一个例子,虽然colors.valueOf()方法返回的还是一个数组,但是在alert输出的时候隐式调用了toString方法,所以结果是相同的。
- 但是如果是数值运算优先调用valueOf()方法。
解析: - 第一次输出:arr==="";类型都不同,不会调用toString也不会调用valueOf。返回false
- 第二次输出:arr=="";类型不同但是调用toSrting再进行比较。最后返回true
- 第三次输出:arr===1;结果是false道理同第一次输出
- 第四次输出:arr==1;结果是true,道理同第二次输出,两个方法不是都被重写,调用的是toString方法。
- 第五次输出:arr == 2;结果是true,调用valueOf方法。
- 第六次输出:类型都是同样的object,但是值不相同,所以返回的结果是false
第五题
- fun(),执行的是obj.b(),此时的this.a中的this是指向window的,而全局变量的a=0,所以第一个fun()的输出是0
- fun.apply(obj),把obj对象传进去,这相当于执行fun()的时候,this.a其实是obj.a,this指向obj,所以输出是1
- fun.bind(obj1).apply(obj); bind函数有个特点,绑定之后永久生效,因为先执行fun.bind(obj1),所以this指向obj1,this.a其实是obj1.a,输出为2.
- new fun(),新建了一个对象,this指向的是new的对象,而这个new的对象并没有属性a的,所以输出undefined.
第六题
首先,对象的prototype最终指向都是object,这是js原型链
定义的。而在JavaScript中函数也是一个对象,所以一开始typeof func.prototype
输出的是object
然后func函数对象的原型有getName()方法。``Obj.__proto__ = func.prototype;
这句让obj也继承了func函数对象
的原型。让obj也有getName()
方法。
然后func.call(Obj);
然后this指向了obj
相当于obj.name="Hellen"
。
所以后面的输出自然是yes ,Hellen, end.
第七题
对象的prototype最终指向都是object,这是js原型链
定义的。而在JavaScript中函数也是一个对象,所以一开始typeof func.prototype
输出的是object
第八题
function func(source) {
var target = {};
for (var key in source) {
// key==a1,a2,a3.....
if (Object.prototype.hasOwnProperty.call(source, key)) {
// 判断是否有a1该属性
// console.log(source[key]) 键的值
// console.log(typeof null);//object
if (typeof source[key] === 'object') {
// 若有则键的值是对象,则返回函数之后的数据
// 但是由于js的一个bug,typeof null==object,所以还会调用func(null)返回的是初始的target,{},然鹅其他的要么是数组,要么是字符串,undefined不是Object。所以判断为false,执行else语句
target[key] = func(source[key]);
} else {
target[key] = source[key];
}
}
}
return target;
}
var a = { a1: "a1", a2: { b1: "b1", b2: "b2" }, a3: undefined, a4: null, a5: 1 };
var b = func(a);
console.log(b);
第九题
画布大小和CSS
中设置width:250px height:500px
一致,其width和初始值比例为1:1,height和初始值比例为2:1。**因此渲染出来的矩形的高度也将扩大一倍为20px,**则矩形渲染出来的实际面积20X20=400
。
第十题
首先我们知道外层flex
被设置为flex布局,然后left层的flex:3 0 50px
;意思就是放大3倍,然后flex-basis
定为50px,意思就是宽度为50px。
同理看right布局,flex: 2 0 100px;
意思是放大两倍,flex-basis
定为100px,宽度为100px。
现在我们外层flex总宽度为200px,减去left的50px,再减去right的100px,剩下50px。剩下的50px按照各自的放大倍数比例去分配空间,left分到50*3/5=30px,right分到20px。所以最后left布局应该是80px,right布局应该是120px。他们的宽度比2:3
除此之外,我们要注意的是,flex-basis为0%时,表示在分配多余的空间之前。该项目已经不占据空间了,他的 width已经失效了,这个元素的width为0 ,而最后的width还是要这个元素的width加上分配完全部剩下的按放大比例分配的width。 当flex-basis为auto时,则width取值为这个元素原先设置的width。最后的width算法同上。