第一次去面试,面试官问我0.1 + 0,2 __ 0.3?估计不少人都知道在 JS 中0.1 + 0.2 != 0.3 的,至于大于仍是小于还真没弄明白。前端
像这种变态的问题,在 JS 中存在不少,那小鹿就干脆整理成了一系列,但愿对你的 JS 基础进一步加牢,也但愿你能在面试中顺利拿到 offer。面试
一、学习困惑算法
我先谈谈我本身以前在方面遇到的困惑,学习 JS 不少基础的知识起初不是那么顺利的,尤为是刚接触 JS 的时候,由于 JS 历史遗留了一些 bug,再加上它是弱类型语言,不像其它面向对象强类型语言不少概念同样清晰。编程
二、学习建议bash
不建议在刚接触就深刻学习,不少知识知道这么回事就能够,好比null为何经过 typeof 检测为对象类型,一开始你只知道他经过 typeof 检测为对象类型就能够。何时去理解这些知识点的原理?网络
若是你以为本身很懒,那就先不要去学习了,若是你对它的原理感兴趣,天然而然你就学会探索了。可是,到了面试的时候,当面试官问到你这块问题的时候,会递归式的问你了,到时候,你不得不去学原理了,这是你会发现,这些原理性的东西零散,这我的说东,那我的说西,而后我就根据优质的文章本身学习了下,整理成了一系列。数据结构
JS 的基本类型分为两大类型,分别为原始类型和对象类型。函数
原始类型包括哪些?对象类型包括哪些?为何要这样分类?他们的区别又是什么?性能
原始类型存储的都是值,而对象类型存储的都是地址。以下图:学习
如上图所示,咱们清楚了原始类型和对象类型最根本的区别,那么问题又来了,当咱们进行变量之间赋值的时候,原始类型直接赋值的是值,而对象类型赋值的是地址。
因此,当咱们将对象做为参数进行传递的时候,在函数内改变的是该地址指向的对象,而传递的参数是原始类型,则改变的是一个副本(复制的另外一个值)。也就是说,若是是对象,则改变了原始的值,而不能改变原始类型原始的值。
原始类型共六种,分别为String、Number、Boolean、null、undefined、symbol
。
接下来对这六种原始类型中存在的问题咱们逐一解决。
对于null有一个历史存留的 bug,null是对象类型吗?虽然咱们使用 typeof 检测null是对象类型,这实际上是一个 bug。
2.1 缘由是什么?
由于 JS 最初的版本是 32 位系统的,为了将性能将用低位存储变量类型信息,000 开头表示表明的是对象,此时null表示全零,因此系统就错误的将null判断为对象类型。虽然 JS 内部判断代码已经更改,可是这个 bug 一直留存下来。
2.2 null 出现的状况汇总
一、手动设置变量的值或者对象某一个属性值为null(此时不赋值,后边会赋值)。
二、在 JS 的 DOM 元素获取中,若是没有获取到指定的元素对象,结果通常都是null。
三、Object.prototype._proto_的值也是null。
四、正则捕获的时候,若是没有获取到结果,默认的也是null。
有关symbol使用的比较少,可是它的存在是有缘由的。
3.1 symbol 是什么?
symbol表示独一无二的值,由于因为对象的属性都是字符串类型,咱们避免不了相同字符串冲突的问题。因此为了防止对象的属性都是字符串类型而冲突引入的。
3.2 symbol 的使用
// 一般参数是字符串类型,若是为对象类型,就会调用 toString 方法
let s1 = Symbol(参数);// 这个参数能够认为是 Symbol 实例的一个描述,用于区分
// 第一种写法
let a = {};
a[s1] = 'Hello!';
// 第二种写法
let a = {
[s1] = 'Hello';
}
复制代码
4.1 undefined 出现的状况?
一、变量提高: 只声明未定义默认值就是undefined。
二、严格模式下:没有明确的执行主体,this就是undefined。
三、对象没有这个属性名,属性值是undefined。
四、函数定义形参不传值,默认就是undefined。
五、函数没有返回值(没有return或者return;),默认返回的就是 undefined。
上边咱们讲了一些有关数据类型的坑,咱们回过头来,0.1 + 0.2 __ 0.3呢?为何会出现不相等的状况呢?面试该如何回答面试官?
5.1 是什么致使了这种状况?
缘由很简单,JS 采用的是双精度版本,这个版本就存在精度问题,就致使了上边这种状况。
5.2 内部的原理是什么?
咱们计算机的信息所有转化为二进制进行存储的,那么0.1的二进制表示的是一个无限循环小数,该版本的 JS 采用的是浮点数标准须要对这种无限循环的二进制进行截取,从而致使了精度丢失,形成了0.1再也不是0.1,截取以后0.1变成了 0.100...001,0.2变成了0.200...002。因此二者相加的数大于0.3。
那好,既然0.1不等于0.1了,那为何我在控制台上输出console.log(0.1)还等于0.1呢?
由于在输入内容进行转换的时候,二进制转换成十进制,而后十进制转换成字符串,在这个转换的过程当中发生了取近似值,因此打印出来的是一个近似值。
若是你把上边的原理和面试官一说,卧槽,面试官不给你 offer 都难,哈哈,开个玩笑,拿到 offer 不只靠基础,也要靠你的其余综合能力。
今天咱们主要总结了一下有关 JS 基础的知识点,虽然这些知识点比较坑,也比较杂,可是经过整理清晰了不少,文章中可能讲的地方有问题,能够给小鹿指出。
这些不可是基础,更是面试中最高频面试官经常问到了,不一样的公司面试官的问法也是大不相同,因此换汤不换药,上边总结的知识点也存在不少不足的地方,欢迎各位大佬补充。
文章都看完了,为什么不妨点个赞呢?嘻嘻,那就说明你很自私,你怕那么好的文章让别人也看到。开个小小玩笑。
其实我也很自私,我把个人一直以来坚持原创的公众号:「小鹿动画学编程」偷偷给你,里边汇聚了小鹿以动画形式讲解的数据结构与算法、网络原理、Web 等技术文章。
做者Info:
【做者】:小鹿
【原创公众号】小鹿动画学编程
【简介】:和小鹿同窗一块儿用动画的方式从零基础学编程,将Web前端领域、数据结构与算法、网络原理等通俗易懂的呈献给小伙伴。公众号回复 “资料” 送一从零自学资料大礼包!
【转载说明】:转载请说明出处,谢谢合做!~