null 和 undifined 的区别
- null 是保留关键字,undefined 是 js 内置属性,局部作用域下可以被赋值,可以使用
void 0
来代替 - null 是原型链的终点
- Number(null) --> 0; Number(undefined) --> NaN;
- null 表示空,undefined 表示未声明或者声明了但是未赋值的变量
typeof & instanceof
typeof
主要用来判断基础类型,除了 null 返回 object(二进制,js 中前三位为 0,则判为对象,null 全为 0),其他都能准确返回对应类型,引用类型除了 function 返回 function,其他都返回 object。instanceof
用来判断构造函数的原型对象(prototype)在不在实例对象的原型链上。Object.prototype.toString.call()
,推荐使用这种方式来判断类型,每一种都能准确获得。
// 推荐判断方式
export const getType = source => Object.prototype.toString.call(source).replace(/\[object\s(.*)\]/, '$1');
执行上下文
js 代码是在执行上下文中执行的,三种执行上下文。
- 全局执行上下文,默认的,在浏览器中是 window 对象,并且 this 在非严格模式下指向它
- 函数执行上下文,JS 的函数每当被调用时会创建一个上下文
- Eval 执行上下文,eval 函数会产生自己的上下文,这里不讨论
栈,先进后出,当引擎第一次遇到 JS 代码时,会产生一个全局执行上下文并压入执行栈,每遇到一个函数调用,就会往栈中压入一个新的上下文。引擎执行栈顶的函数,执行完毕,弹出当前执行上下文。
函数式编程
关键词:纯函数,不可变,声明式,表达式。
纯函数:对相同输入得到的结果都是同样的,并且没有产生任何副作用。
babel 编译原理
- babylon 将 ES6/ES7 代码解析成 AST
- babel-traverse 对 AST 进行遍历转译,得到新的 AST
- 新 AST 通过 babel-generator 转换成 ES5
原型和原型链
理解很重要,我基本是靠一张图记忆下来的。
js 进制转换
10进制 --> 其他进制: Number(val).toString([2,8,10,16])
其他进制 --> 10进制: Number.parseInt('val',[2,8,10,16])