【前端面试题】关于一些js的一些面试题(金融行业),我和面试官扯了三个小时

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

5.1rem,1em,1vh,1px的含义

6.calc,support,media的含义及用法?


1.防抖函数与节流函数?

场景:前端常见实用场景,有滚动加载、搜索框输入、窗口大小拖拽 Resize。

区别与联系:

函数节流:是确保函数特定的时间内至多执行一次。

函数防抖:是函数在特定的时间内不被再调用后执行。

他们都是可以防止一个函数被无意义的高频率调用.

函数防抖

function throttle(method,context){

clearTimeout(method.timer)

method.timer = setTimeout(function(){

method.call(context)

},500)

}

这个方法接受你想防抖的函数以及他的上下文,然后在500ms延时之后执行这个函数,若下一次函数在500ms内调用则清除上个定时器然后在延迟500ms执行,函数防抖有效的防止了一个函数被多次调用,比如onresize,onmouseover和上述的键盘监听事件

函数节流

// 函数节流

var canRun = true;

document.getElementById(“throttle”).onscroll = function(){

if(!canRun){

return

}

canRun = false

setTimeout( function () {

console.log(“函数节流”)

canRun = true

}, 500)

}

用一个flag让该函数在500ms内只执行一次.

2.如何判断一个自然数能否被2^n整除?整除返回true,不能整除返回false。

这个问题是他们二面的金融技术主管直接问的,我当时回答的两种方法发现死活绕不过去次幂的问题,就只好放弃了。这里梳理一下。

方法一:二进制法

function check(num){

return (num > 0) && ((num & (num - 1)) == 0);

}

通过二进制的方法可以判断一个数num是不是2的n次方幂,规律可知,只要是2的次方幂,必然是最高位为1,其余为0,当num-1时,则最高位是0,其余是1.

按位与运算:  1&1=1  0&1=0 0&0=0 1&0=0

2     —>   10                   3    —>   11

4     —>   100                 6    —>   110

8     —>   1000               7    —>   111

例子:

8   的二进制   1000      8-1 的二进制  0111    按位与运算      1000&0111    -->  0000    所以8是2的n次方幂。

9   的二进制   1001      9-1 的二进制  1000    按位与运算      1001&1000   —> 1000   所以9不是2的次方幂。

24  的二进制  11000     24-1 的二进制  10111  按位与运算    11000&10111  —> 10000  所以24不是2的次方幂。

可以通过num.toString(2)来写出num的二进制。

读一些源码的话,发现上面的是最优解。

方法二:取余法

function check(num){

if(num != 1){

while(num != 1){

if(num%2 == 0){

num = num / 2;

}else{

return false;

}

}

return true;

}else{

return true;

}

}

如何判断一个数是否是2的n次方幂,其简单判断方法就是这个数num直接除2,若余数为0,则num/2再除2,再判断是不是余数是不是0,是的话继续按上一步来,直到最后为num=1。

比如:

2  2%2=0  (2/2)=1                                                                             是

4  4%2=0  (4/2)%2=0  (4/2/2)=1                                                       是

6  6%2=0  (6/2)%2=1                                                                       不是

7  7%2=1                                                                                         不是

24 24%2=0   (24/2)%2=0   (24/2/2)%2=0   (24/2/2/2)%2=1            不是

3.递归实现1到100的和?

我当时都忘记递归的形式了,直接用了for循环,他一面面试我,我又重新给他说了一个递归的实现。

方法一:递归

function num(n){

if(n==1) return 1;

return num(n-1)+n;

}

num(100);

方法二:for循环

var sum = 0;

for(i=0;i<=100;i++){

sum +=i;

}

console.log(“sum=”+sum);

4.有一个数组【1,2,3,4,1,2】去掉其中的重复数字变为【3,4】.

我当时直接用的一个for循环,然后两个两个比较,有相同的就加个判断,都给她移除,最后就会剩下【3,4】。最后他给我剖析了一下,如果有三个相同的数字怎么搞?说我的思维不对,我日了狗了。不过对于这个题,程序确实没毛病。

方法一:优化遍历数组法

获取没重复的最右一值放入新数组。(检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断)

function unique1(array){

var r = [];

for(var i = 0, l = array.length; i<l; i++){

for(var j = i + 1; j < l; j++)

if(array[i] == array[j]) j == ++i;

r.push(array[i]);

}

return r;

}

//测试代码:

var arr=[1,2,3,4,5,1,2];

var rel=unique1(arr);

console.log(rel);

方法二:对象键值对法

新建一js对象以及新数组,遍历传入数组时,判断值是否为js对象的键,不是的话给对象新增该键并放入新数组。

//注意点: 判断 是否为js对象键时,会自动对传入的键执行“toString()”,不同的键可能会被误认为一样;例如: a[1]、a[“1”] 。解决上述问题还是得调用“indexOf”。

//速度最快, 占空间最多(空间换时间)

function unique(array){

var n = {}, r = [], len = array.length, val, type;

最后

你要问前端开发难不难,我就得说计算机领域里常说的一句话,这句话就是『难的不会,会的不难』,对于不熟悉某领域技术的人来说,因为不了解所以产生神秘感,神秘感就会让人感觉很难,也就是『难的不会』;当学会这项技术之后,知道什么什么技术能做到什么做不到,只是做起来花多少时间的问题而已,没啥难的,所以就是『会的不难』。

我特地针对初学者整理一套前端学习资料

前端路线图

vue.js的36个技巧

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
,知道什么什么技术能做到什么做不到,只是做起来花多少时间的问题而已,没啥难的,所以就是『会的不难』。

我特地针对初学者整理一套前端学习资料

[外链图片转存中…(img-sjtb4wxH-1713432297117)]

[外链图片转存中…(img-55czU1nh-1713432297117)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-AB881vxq-1713432297117)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值