JS 中的数据类型
原始值类型 [值类型/基本数据类型]
- number 数字
- string 字符串
- boolean 布尔
- null 空对象指针
- undefined 未定义
- symbol 唯一值
- bigint 大数
对象类型 [引用数据类型]
- 标准普通对象 object(key 只能为 string 或者 Symbol)
- 标准特殊对象 Array, RegExp, Date, Math, Error, Set, Map...
- 非标准特殊对象 Number, String, Boolean...
- 可调用/执行对象 function
数据类型检测的方法
- tyoeof
- instanceof
- constructor
- object.prototype.toString.call(value)
其中 typeof 和 toString 是最常用的, 这里我们主要讨论 typeof。
typeof 检测数据类型
// - typeof 总会返回一个字符串
typeof 12 "number"
typeof "杨帅" "string"
typeof true "boolean"
typeof undefined "undefined"
typeof Symbol() "symbol"
typeof 10n "bigint"
typeof null "object"
typeof NaN "number"
typeof new Number(1) "object"
typeof new Date() "object"
typeof {} "object"
typeof [] "object"
typeof function(){} "function"
这里延伸一道面试题
请说出与 typeof typeof typeof [1, 2, 3] 返回值 ?
有了上面的知识储备,我们很轻易的得出答案就是 "string"
我们可以发现,typeof 检测引用类型的话,只能区分出函数,剩下的他都区分不开,甚至于原始类型 null,返回值也是 object。
typeof 检测未声明的变量
// - typeof 检测一个未声明的变量 不会报错 返回 undefined
typeof n "undefined"
这个用处在哪儿呢,比如我们封装有一个类库,需要判断 window 存不存在,就可以用 typeof 来检测。
(function() {
let utils = {};
if (typeof window !== "undefined") {
// 浏览器环境下
window.utils = utils;
}
if (typeof module === "object" && typeof module.exports === "object") {
// 符合 commonJs 规范
}
})();
typeof null
typeof null // "object"
为什么 typeof null 是 "object" 呢,因为计算机底层是按二进制来存储数据的值,而 typeof 也是按着计算机底层存储的二进制来进行检测的,而且是按二进制前几位来区分数据类型(如果是对象,还要区分有没有实现 call 方法),这样效率是最高的,但也导致了这个问题。
> 以 000 开始 对象
> 以 1 开始 整数
> 以 010 开始 浮点数
> 以 100 开始 字符串
> 以 110 开始 布尔
> 以 000000... 开始 null
> 以 -2^30 开始 undefined
可以看到,null 也是 000 开头的,所以会被 typeof 误认为是 "object"。
typeof 函数
typeof function() {} // "function"
有同学可能会疑问,函数也属于对象啊,它属于可调用/执行对象,为什么 typeof 检测一个函数返回 "funcion",其实我们前面也说了,如果检测结果是对象,typeof 会多做一步操作,看对象是否实现了 call 方法(这个 call 方法是检测函数底层实现的 call 方法,而不是对象随便加个 call 方法),如果实现了 call 方法,则返回 "function"。
总结 typeof 的几大特点
- 特点1: 返回的结果是字符串,字符串中包含了对应的数据类型。
- 特点2: 按照计算机底层存储的二进制进行检测,效率高
> 以 000 开始 对象
> 以 1 开始 整数
> 以 010 开始 浮点数
> 以 100 开始 字符串
> 以 110 开始 布尔
> 以 000000... 开始 null
> 以 -2^30 开始 undefined
- 特点3: typeof null -> "object'
- 特点4: typeof 对象 -> "object" && typeof function -> "function"
- 特点5: typeof 未被声明的变量 -> "undefined"