# 进阶篇
进阶题更看重你能不能解释“为什么”,不用把每段源码都背下来。先挑工作中碰过的性能、框架或工程化问题,按现象、原因、排查过程和最终方案讲一遍;遇到没实践过的题,读完解析后试着用一个小例子验证自己的理解。
# 一、JS基础
# 1 类型及检测方式
⚡ 30 秒速记
- 8 种类型:7 个原始类型
numberstringbooleannullundefinedsymbolbigint+ 引用类型object - 赋值区别:原始类型复制值,引用类型复制地址,改一个另一个跟着变
typeof:原始类型和函数够用,但null、数组、对象都返回'object'instanceof看原型链,判断不了原始类型,跨iframe会失效;constructor能被改写,不可靠- 最准是
Object.prototype.toString.call(v),数组直接用Array.isArray;typeof null === 'object'是历史遗留问题
JS 有 7 种原始类型加一种 object,检测方法要看场景挑:typeof 判原始类型,Array.isArray 判数组,要精确区分内置对象就用 Object.prototype.toString.call()。 typeof 最大的坑是 typeof null 也是 'object',这是第一版 JS 留下的历史问题,一直没改。instanceof 本质是沿原型链找 Constructor.prototype,所以跨 iframe 传过来的数组会判成 false。toString.call([]) 会返回 '[object Array]',日期、正则、Map 都能分清,我写工具函数一般就封装它。另外「原始值存栈、对象存堆」是个理解模型,引擎实际实现更复杂,面试讲到赋值是复制值还是复制地址就够了。
1. JS内置类型
JavaScript 的数据类型有下图所示

其中,前 7 种类型为基础类型,最后
1 种(Object)为引用类型,也是你需要重点关注的,因为它在日常工作中是使用得最频繁,也是需要关注最多技术细节的数据类型
JavaScript一共有8种数据类型,其中有7种基本数据类型:Undefined、Null、Boolean、Number、String、Symbol(es6新增,表示独一无二的值)和BigInt(es10新增);- 1种引用数据类型——
Object(Object本质上是由一组无序的名值对组成的)。里面包含function、Array、Date等。JavaScript不支持任何创建自定义类型的机制,而所有值最终都将是上述 8 种数据类型之一。- 引用数据类型: 对象
Object(包含普通对象-Object,数组对象-Array,正则对象-RegExp,日期对象-Date,数学函数-Math,函数对象-Function)
- 引用数据类型: 对象