28,350道Web前端面试真题分享

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

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

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

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

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

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

正文

举个栗子:

let num = 996;

console.log(num.toString(8));//转为8进制字符串

console.log(num.toString(16));//转为16进制字符串

console.log(num.toString(32));//转为32进制字符串

代码执行结果如下:

image-20220519082347999

base的范围可以从236,如果不填默认为10

注意,如果使用数字直接调用toString方法,在有些情况下需要是应用两个.,举例如下:

console.log(123.toString(8));//Error,语法错误

console.log(123…toString(8));//正确,173

数字后面有两个.,这是因为在JavaScript中数字后面的第一个.被认为是小数点,第二个点才是调用函数的.

如果是小数就不存在这个问题,举个栗子:

console.log(3.14.toString(8));

亦或者,我们使用小括号可以避免使用两个点,举个栗子:

console.log((123).toString(8));//'173

舍入


舍入是数字最常用的操作之一,通常包括:

  1. 向下取整,Math.floor(num)

console.log(Math.floor(3.14));//3

console.log(Math.floor(9.99));//9

console.log(Math.floor(-3.14));//-4

console.log(Math.floor(-9.99));//-10

不遵循四舍五入原则,直接取小于等于当前数值的最近整数。

  1. 向上取整,Math.ceil(num)

console.log(Math.ceil(3.14));//4

console.log(Math.ceil(9.99));//10

console.log(Math.ceil(-3.14));//-3

console.log(Math.ceil(-9.99));//-9

不遵循四舍五入原则,直接取大于等于当前数字的最近整数。

  1. 就近取整,Math.round(num)

console.log(Math.round(3.14));//3

console.log(Math.round(9.99));//10

console.log(Math.round(-3.14));//-3

console.log(Math.round(-9.99));//-10

遵循四舍五入原则,取距离当前数字最近的整数。

  1. 移除小数,Math.trunc(num)

console.log(Math.trunc(3.14));//3

console.log(Math.trunc(9.99));//9

console.log(Math.trunc(-3.14));//-3

console.log(Math.trunc(-9.99));//-9

直接移除小数点后面的数字,取整数位。IE浏览器不支持这个方法

对比以上四种方法:

| | Math.floor | Math.ceil | Math.round | Math.trunc |

| :-: | :-: | :-: | :-: | :-: |

| 3.14 | 3 | 4 | 3 | 3 |

| 9.99 | 9 | 10 | 10 | 9 |

| -3.14 | -4 | -3 | -3 | -3 |

| -9.99 | -10 | -9 | -10 | -9 |

精度


上述方法只是简单的把小数舍入成了整数,在有些情况下,我们需要特定精度的小数,例如取圆周率后4位应该怎么办呢?

有两种方法:

  1. 数学乘除计数

let pi = 3.1415926;

console.log(Math.round(pi * 10000) / 10000);//3.1416

上述代码先将pi乘以10000,然后取整,再除以10000,从而得到了符合精度要求的结果。但是,这么做看起啦呆呆的,JavaScript为我们提供了更简单的方法。

  1. toFixed(n)

let pi = 3.1415926;

console.log(pi.toFixed(4));//3.1416

以上代码看起来输出上没有什么问题,实际上,toFixed返回的是一个字符串,如果我们需要一个数字类型,要转换一下才行,可以使用单目运算符+ pi.toFixed(4)

此外,如果小数的尾数长度不够,toFixed会在后面补上'0':

let num = 3.1;

console.log(num.toFixed(9));

代码执行结果如下:

在这里插入图片描述

这也侧面证明了toFixed的返回值是一个字符串,否则0会被省略。

偏差


浮点数表示在很多情况下总是存在偏差

在计算机内部,浮点数根据IEEE-754标准进行表示,其中单精度浮点数32位,双精度浮点数64位。在双精度浮点数中,1位用于表示符号,52位用于存储有效数字,11位存储小数点的位置。

偏差现象

虽然64位已经可以表示非常大的数字了,但是仍然存在越界的可能,例如:

let bigNum = 1e999;

console.log(bigNum);//Infinity

越过做最大值的数字将变为Infinity(无穷),这样就丢失了原有数字的大小,属于偏差的一种。

还有一种偏差,需要我们学习:

console.log(0.1+0.2 === 0.3);//false

console.log(0.1 + 0.2);

代码执行结果如下:

image-20220519160006190

没错,0.1 + 0.2的结果并不是0.3,而是一堆0后面加个4

这种偏差是非常致命的,尤其在商城、银行工作场景中,即使是一个非常小的偏差,在高流水场景下都会丢失无尽的财富。

曾经听说过一个银行员工通过克扣工人工资,盗取百万财富的故事,每个员工的工资只克扣2毛!

我想这种事情发生在我身上,我肯定发现不了,所以无时无刻的精确是多么的重要。

这个故事不知真假~~

偏差原因

先以我们常见的十进制为例,我们都知道,小数中存在两个奇葩,一个叫无限循环小数,另一个叫无限不循环小数,例如1/3就是一个无限循环小数0.3333333(3),而圆周率就是一个无限不循环小数。无限就意味着无法用数字清楚的描述这个数字的大小,我们能写出来的都是不精确的。

二进制同样存在一些无限循环的数字,不同的是在十进制中0.1这种看起啦很简单的数字,在二进制中却是无限循环小数。

举个例子:

let x = 0.1;

console.log(x.toFixed(20));

代码执行结果如下:

image-20220519210525387

是不是觉得不可思议呢?我们只是简单的创建了一个变量并赋值0.1,然后取小数点后20位,却得到了一个匪夷所思的结果。

如果我们换一个角度或许会更容易理解这种现象,在十进制中,任何整数除以10或者10整数次幂都是正常的精确的数字,例如1/10或者996/1000。但是,如果以3为除数,就会得到循环的结果,例如1/3

这种描述如果换到二进制上,同样是成立的。

在二进制中,任何整数除以2或者2的整数次幂都是正常的精确的数字,但是,如果以10为除数,就会得到无限循环的二进制数。

所以,我们就可以得出结论,二进制数字无法精确表示0.10.2就像十进制没有办法描述1/3一样。

注意:

这种数据上的偏差并非JavaScript的缺陷,像PHP、Java、C、Perl、Ruby都是同样的结果。

解决方法

  1. 舍入

在展示一个无限循环小数的时候,我们可以直接使用toFixed方法对小数进行舍入,该方法直接返回字符串,非常方便用于展示价格。

0.3.toFixed(2);//0.30

  1. 使用小单位

另外一种方式是,我们可以使用较小的单位计算诸如价格、距离,例如采用分而不是元计算总价,实际上很多交易网站都是这么做的。但是这种方法只是降低小数出现的次数,并没有办法完全避免小数的出现。

Infinity、NaN


JavaScript数字中有两个特殊值:InfinityNaN

如何判断一个数字是不是正常数字呢?

我们可以使用两个方法:

  1. isFinite(val)

console.log(isFinite(NaN));//false

console.log(isFinite(Infinity));//false

console.log(isFinite(3));//true

console.log(isFinite(‘12’));//true

代码执行结果如下:

image-20220519213639881

console.log(isFinite(‘xxxx’));//false

console.log(isFinite(‘Infinite’));//false

console.log(isFinite(’ '));//true,空串转为0

代码执行结果如下:

image-20220519213951573

  1. isNaN(val)

console.log(isNaN(NaN));//true

console.log(isNaN(‘Infinite’));//true

代码执行结果:

image-20220519214352840

为什么要使用isNaN函数而不是直接判读呢?

console.log(NaN === NaN);//false

代码执行结果如下:

image-20220519214505629

这是因为NaN不等于任何数,包括自身。

Object.is


Object.is(a,b)可以判断参数ab是否相等,若相等返回true,否则返回false,它的结果只有三种情况:

  1. 可以比较NaN

console.log(Object.is(NaN,NaN));//true

代码执行结果:

image-20220519214919271

  1. 0 和 -0

console.log(Object.is(0,-0));//false

代码执行结果:

image-20220519215000647

在计算机内部,正负使用01表示,由于符号不同,导致0-0实际上是不同的,二者的表示方式也不一样。

  1. 其他

​ 其他比较情况和a === b完全相同。

parseInt、parseFloat


parseIntparseFloat可以把字符串转为数字,与+Number不同的是,二者的限制更为松散。例如,像"100¥"这样的字符串使用+Number必然返回NaN,而parseIntparseFloat却能轻松应对。

举个例子:

console.log(+“100¥”);

console.log(parseInt(“100¥”));

console.log(parseFloat(“12.5¥”));

代码执行结果:

image-20220519220359414

parseIntparseFloat会从字符串中读取数字,直到无法读取为止。二者特别适合处理像"99px""11.4em"这种数字开头的字符串情况,但是对于其他字符开头的字符串则返回NaN

console.log(parseInt(‘ff2000’));//NaN

但是,我们发现ff2000实际上是一个十六进制的数字字符串,parseInt同样可以处理这种情况,不过需要添加一个进制参数。

举个例子:

console.log(parseInt(‘FF2000’,16));//16719872

console.log(parseInt(‘0xFF2000’,16));//16719872

最后

javascript是前端必要掌握的真正算得上是编程语言的语言,学会灵活运用javascript,将对以后学习工作有非常大的帮助。掌握它最重要的首先是学习好基础知识,而后通过不断的实战来提升我们的编程技巧和逻辑思维。这一块学习是持续的,直到我们真正掌握它并且能够灵活运用它。如果最开始学习一两遍之后,发现暂时没有提升的空间,我们可以暂时放一放。继续下面的学习,javascript贯穿我们前端工作中,在之后的学习实现里也会遇到和锻炼到。真正学习起来并不难理解,关键是灵活运用。

css源码pdf

JavaScript知识点

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

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

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

举个例子:

console.log(parseInt(‘FF2000’,16));//16719872

console.log(parseInt(‘0xFF2000’,16));//16719872

最后

javascript是前端必要掌握的真正算得上是编程语言的语言,学会灵活运用javascript,将对以后学习工作有非常大的帮助。掌握它最重要的首先是学习好基础知识,而后通过不断的实战来提升我们的编程技巧和逻辑思维。这一块学习是持续的,直到我们真正掌握它并且能够灵活运用它。如果最开始学习一两遍之后,发现暂时没有提升的空间,我们可以暂时放一放。继续下面的学习,javascript贯穿我们前端工作中,在之后的学习实现里也会遇到和锻炼到。真正学习起来并不难理解,关键是灵活运用。

[外链图片转存中…(img-A0WVeTkf-1713276520510)]

[外链图片转存中…(img-lWmgd86D-1713276520511)]

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值