昨天面试了一家公司,今天我就来总结一下有关昨天的面试经历及心得
说实话这是我截止到目前第一家让写笔试题的线下面试,当时挺崩溃的,我拿到填写个人信息的表格和面试题,首先填写了个人的相关信息,然后大概看了一下笔试题的内容,说实话我是真的没有写完整的能力,这种纯js的代码题,真的是难为我了,我就写了第二题和第三题,一个是考察大数相加另一个是考察宏任务和微任务的,就写了两道题。后边的我真的写不下去,就直接跟前台小姐姐说不好意思,可能不太合适。前台小姐姐就问我要不要约面试,还说来都来了,我想也是,大老远的。就让前台小姐姐帮忙安排一下。然后就进入了面试环节,因为之前面试带过一次简历,但当时去面试发现面试官都会打印简历,之后就没有带简历的习惯了,昨天就相当尴尬,我没有带简历,面试官也没有打印简历,整个面试都是面试官直接用电脑看着我的电子版的简历面试的,真的是挺奇葩的。 整个面试笔试部分相当惨烈,面试部分面试官的问题回答得还算可以,面对面试官的一些较深入的问题,我可能不太清楚,我说完我的思路之后会反问面试官他会如何解决,当然面试官也一一解答了,其实也算是在面试中学到了一些东西。
笔试
1.查看下面代码,请说出输出是什么?
var myObject = {
foo:'bar',
func:function(){
var self = this;
console.log("outer func:this.foo ="+this.foo);
console.log("outer func: self.foo="+self.foo);
(function(){
console.log("inner func: this.foo ="+this.foo);
console.log("inner func: self.foo="+self.foo)
}());
}
};
myObject.func()
输出结果:
outer func:this.foo =bar
11.15.html:16 outer func: self.foo=bar
11.15.html:18 inner func: this.foo =undefined
11.15.html:19 inner func: self.foo=bar
解析: 1.第一个this.foo输出bar,因为当前this指向对象myObject。
2.第二个self.foo输出bar,因为self是this的副本,同指向myObject对象。
3.第三个this.foo输出undefined,因为这个IIFE(立即执行函数表达式)中的this指向window。
4.第四个self.foo输出bar,因为这个匿名函数所处的上下文中没有self,所以通过作用域链向上查找,从包含它的父函数中找到了指向myObject对象的self。
原文链接:blog.csdn.net/YXB413/arti…
2.查看下面代码,请问输出是什么?
console.log(0.1+0.2);
console.log(0.1+0.2==0.3);
输出结果:
0.30000000000000004
false
解析详见: juejin.cn/post/697177…
3.查看下面代码,按照顺序,输出的是
(function () {
console.log(1);
setTimeout(function () {
console.log(2)
}, 1000);
setTimeout(function () {
console.log(3)
}, 0);
console.log(4)
})()
输出结果: 1 4 3 2 解析:主要考察EventLoop事件循环,宏任务和微任务的执行顺序:
- script全局代码是一个宏任务;
- 先执行完成宏任务,并且执行一个宏任务,就去执行微任务;
- 执行宏任务之前必须保证微任务队列里面为空;
- Promise的回调函数是同步代码是立即执行。
具体详见: www.jianshu.com/p/b5677c51c…
4.查看下面代码,输出是什么?
var a={},
b={key:'b'},
c={key:'c'};
a[b]=123;
a[c]=456;
console.log(a[b]);
输出:456
解析如下:当一个对象的属性即key值是一个对象的时候,会调用原型上的toString方法将其转化为字符串,所以a[c]也被转化了,然后key值就是一个字符串[object Object],所以a[b]就变覆盖了,得出答案为456 blog.csdn.net/THINK_OF_/a…
5.实现sum函数,满足下面要求
console.log(sum(2,3));//Outputs 5
console.log(sum(2)(3));//Outputs 5
两种方法,具体如下:
//方法一
function sum(x) {
if (arguments.length === 2) {
return arguments[0] + arguments[1];
} else {
return function (y) {
return x + y
}
}
}
//方法二
function sum2(x, y) {
if (y !== undefined) {
return x + y;
} else {
return function (y) {
x + y;
}
}
}
console.log(sum(2)(3))
console.log(sum(2,3))
console.log(sum2(2,3))
6.查看下面代码,分别输出什么
value =1;
var o ={
value: 2,
change:function(x){
this.value = x;
}
}
var o1 = {
value:3
}
o1.change = o.change;
var o2 = o;
o.change(4);
o.change.call(this,5);
o1.change(6);
o2.change(7);
console.log(value);
console.log(o.value);
console.log(o1.value);
console.log(o2.value);
输出结果: 5 7 6 7
7.查看下面代码,输出是
console.log((function f(n){return ((n>1)?n*f(n-1):n)})(10))
输出: 3628800 解析: 相当于是计算10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 blog.csdn.net/weixin_3050…
8.查看下面代码,输出是什么,为什么?
for(var i=0;i<5;i++){
setTimeout(function(){
console.log(i);
},i*1000);
}
输出:全是5 解析参考具体如下: blog.csdn.net/huakaiwuxin…
9.查看下面代码,输出是什么,为什么?
var b=1;
function outer(){
console.log("first b:",b);
var b = 2
function inner(){
b++;
console.log("second b:",b);
var b =3;
console.log("third b:",b)
}
inner();
}
outer();
输出结果:
first b: undefined;
second b: NaN;
third b: 3
10.实现一个duplicate函数,输入一个字符串数组,返回该字符数组中重复次数最多的字符串和重复次数;如果没有重复,则返回null
function duplicate(strArray);
var strArray1=["1","2","1","4","4","1"];
var result = duplicate(strArray1)//返回字符串“1”和重复次数3
var startArray = ["1","2"];
result = duplicate(strArray2)//返回空
实现方法:
js代码:
function findNum(a) {
var result = [0, 0];
for (var i = 0; i < a.length; i++) {
for (var j = 0, count = 0; j < a.length; j++) {
if (a[i] == a[j]) {
++count;
};
};
if (count > result[0]) {
result[0] = count;
result[1] = a[i];
} else if (count == result[0] && result[1] < a[i]) {
result[1] = a[i];
}
}
alert("数" + result[1] + "重复了最多次,为" + result[0]);
}
var arr = [2, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 43, 3];
findNum(arr);
11.实现一个有序数组的二分查找函数,对于一个给定的目标值,如果在数组中找到该元素,则返回其所在数组的索引,否则返回-1。 二分法查找的原理如下: (1)首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,返回元素在该数组的位置,则搜索过程结束,否则执行下一步; (2)如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作; (3)如果某一部数组为空,则表示找不到目标元素,返回-1. 如果用javascript写,可以被认为Number类型的数据,只做整数运算,并向下取整。 比如: var i = 1,j=2,k=5; var n = (i+j)/2 ==> n=1 var n = (i+k)/2 ==>n=3 var n= (j+k)/2 ==> n=3;
function binarySearch(Numbers,target);
Numbers = [1,20,34,38,55,90,200,256];
binarySearch(Numbers,20)//返回 1;
binarySearch(Numbers,89)//返回-1,表示未找到
binarySearch(Numbers,55)//返回4
代码如下:
var search = function(nums, target) {
if(nums[0]==target) return 0
var lo=0,hi=nums.length-1
while(lo<hi){
var mid=Math.ceil((lo+hi)/2)
if(nums[mid]==target){
return mid
}else if(nums[mid]>target){
hi=mid-1;
}else{
lo=mid
}
}
return -1
};
//方法二:
var search = function(nums, target) {
if(nums[0]==target) return 0
var lo=0,hi=nums.length-1
while(lo<=hi){
var mid=Math.ceil((lo+hi)/2)
if(nums[mid]==target){
return mid
}else if(nums[mid]>target){
hi=mid-1;
}else{
lo=mid+1
}
}
return -1
};