JS数据类型
原始类型:boolean、string、number、undefined、symbol、bigint、null
引用类型:对象Object(object、array、regexp、date、math、function)
null是对象吗?为啥?
不是,这是js存在的一个悠久bug,在js最初使用的32位系统,000开头代表对象,而null表示全0
说下var、let、const
先说下var对缺点,再来扩展let、const解决的痛点
- var会存在变量提升,从而导致了很多与直觉不符的代码
变量提升所带来的问题
- 变量容易在不被察觉的情况下被覆盖掉
- 本应销毁的变量没有被销毁
0.1+0.2为什么不等于0.3
0.1和0.2转换为二进制都会无限循环,由于标准位数限制后面多余的位数会被截掉,此时就已经了精度损失,相加后因为浮点数的阶段转位十进制就成了0.3000000…4
== 和 === 的区别
== 存在数据类型转换,=== 不仅需要数据类型和值都相等
对象转原始类型
对象在转换类型的时候,会调用内置的 [[ToPrimitive]] 函数,对于该函数来说,算法逻辑一般来说如下:
- 如果已经是原始类型了,那就不需要转换了
- 如果需要转字符串类型就调用 x.toString(),转换为基础类型的话就返回转换的值。不是字符串类型的话就先调用 valueOf,结果不是基础类型的话再调用 toString
- 调用 x.valueOf(),如果转换为基础类型,就返回转换的值
- 如果都没有返回原始类型,就会报错
let a = {
valueOf() {
return 0
},
toString() {
return '1'
},
[Symbol.toPrimitive]() {
return 2
}
}
1 + a // => 3
Object.is和===的区别?
Object在严格等于的基础上修复了一些特殊情况下的失误,具体来说就是+0和-0,NaN和NaN。源码如下:
function is(x, y) {
if(x === y){
//运行到1/x === 1/y的时候x和y都为0,但是1/+0 = +Infinity, 1/-0 = -Infinity, 是不一样的
return x!==0||y!==0||1/x===1/y;
} else {
//NaN===NaN是false,这是不对的,我们在这里做一个拦截,x !== x,那么一定是 NaN, y 同理
//两个都是NaN的时候返回true
return x!==x&&y!==y;
}
}
谈谈你对闭包的理解
红宝书上对于闭包的定义:闭包是指有权访问另外一个函数作用域中的变量的函数
ES5中只存在两种作用域————全局作用域和函数作用域
继承
类数组转数组方法
类数组:nodeList、argument。。。
- [].slice.call()
- […xxx]
- Array.from()