开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
前言:好久不见呀,记得上次写文章还是在金石计划的第一期,时隔两个月没有输出,嘿嘿。最近偷偷的学习了一点面试有关的的题目,在此与各位一起分享一下顺便也记录一下自己的学习点滴。
1. js 原始类型
在js中一共有7种原始值:
- string
- number
- boolean
- null
- undefined
- symbol
- bigint
symbol 与 bigint 都是ES6以后引入的
2. js 中的最大安全值与最小安全值
很多同学都应该听过安全值这一个说法吧,那么具体的值是不是有那么点模糊? 现在看过来
最大值: 2^53 , 2的53次方 最大安全值: 2^53-1 , 2的53次方减一 最小安全值: -2^53, 负的2的53次方
3. 闭包
当面试官问你什么是闭包的时候,你应该怎么说呢?
首先,闭包正确的定义是:假如一个函数能访问外部的变量,那么就形成了一个闭包,而不是一定要返回一个函数。
而在js执行引擎中,一个函数被执行完毕后该函数的执行上下文就会被垃圾回收机制回收;但是,当一个函数内部的函数被返回出来执行,如果内部函数对外部函数中的变量存在引用时,引用的这些变量集合称为闭包;这个集合不会随外部函数的执行上下文的回收而消失。
4. 为什么typeof null ==="Object"
这是因为在JavaScript 中二进制前三位为 000 ,就会被判断成 object;对于 null 来说,很多⼈会认为他是个对象类型,其实这是错误的。虽然 typeof null 会输出 object,但是这只是 JS 存在的⼀个悠久 Bug。在 JS 的最初版本中使⽤的是 32 位系统,为了性能考虑使⽤低位存储变量的类型信息,000 开头代表是对象,然⽽ null表示为全零,所以将它错误的判断为 object 。虽然现在的内部类型判断代码已经改变了,但是对于这个 Bug 却是⼀直流传下来。
5. 为什么 0.1+0.2!=0.3
因为在JS中数字采用的IEEE 754的双精度标准进行存储,简单的理解就是使用二进制位数来存储一个数值,但是这个二进制数位很长,这样得到的数会更加精确。
Js中的小数是浮点数,而浮点数需要转成二进制来运算的,通过二进制进行加减运算,但是有些小数(0.1)就是不能被二进制用来表示,0.1用二进制 表示的话就是一个无限循环的数,而js有极限值,就会截取部分出来,从而造成了精度丢失。
如何解决精度丢失?
解决方法:
- 先转换成整数,再变回小数
- parseFloat((0.1 + 0.2).toFixed(10)) === 0.3 // true
6. isNaN() 和 Number.isNaN()有什么不同?
- isNaN():当我们向isNaN()传递一个参数,它的本意是通过Number()方法尝试将这参数转换成Number类型,如果成功返回fasle,如果失败返回true(也就是is Not a Number判断成功)。所以isNaN只是判断传入的参数是否能转换成数字,并不是严格的判断是否等于NaN。
- Number.isNaN() 只能判断出传入的值是否为NaN;判断传入的参数是否严格的等于NaN(也就是 ===)。
7.预编译
首先预编译发生在代码的执行之前,当然预编译也分为全局预编译和局部预编译,全局预编译发生在页面加载完成时执行,而局部预编译发生在函数执行的前一刻。
- 发生在全局作用域 三部曲
- 创建全局(GO)对象
- 找全局变量声明,将变量声明作为GO的属性名,值为undefined
- 在全局找函数声明,将函数名作为GO对象的属性名,值赋予为函数体
- 发生在函数执行之前( 函数作用域) 四部曲
- 创建函数的作用域(AO:Activation Object)对象
- 找形参和变量声明,将变量声明和形参作为AO的属性名,值为undefined
- 将实参和形参统一
- 在函数体内找函数声明,将函数名作为AO对象的属性名,值赋予为函数体
8.遍历对象时,把原型上的属性遍历出来怎么办?
首先要知道在JS数组遍历中,基本就是 for循环、for-in、for-of、foreach、map等几个方法,然而如果使用for-in遍历到原型上面的属性,而我们不想要这个属性怎么办?
当然可以使用Object.hasOwnProperty()判断对象上是否显示具有某项属性,如果有就不遍历出来。
person.haOwnPorperty(key) && console.log(key) // es6的写法,这句话相当于 if
9. get 和 post 的区别
- get 参数拼接在url后面,post参数在请求体中 // 相对安全
- get 会产生不可控制的缓存,post不会
- get请求的长度是有长度限制的,post没有
- get请求只能进行url编码,post支持多种编码