初探JavaScript的童鞋们,肯定从基础数据类型开始研究,对于我们JavaScript的数据类型信手拈来,而且面试官也会经常问,请你说说JavaScript中的数据类型?
- 基础数据类型
- 复杂数据类型
基础数据类型
- undefined:
undefined - null:
null - boolean:
false - number:
1、NaN(可以用isNaN来检测,返回boolean,也可以用Object.is()来检测两个NaN,结果返回true,因为is方法再内部做了处理,只是检测值,不会做隐式转换。)、Infinity - string:
'1' - symbol:
Symbol(1),可用作对象的唯一属性,可用Object.getOwnPropertySymbols()获取到值。可用于宏观唯一标识处理、底层原理应用。 - bigint:
1000n - ...
复杂数据类型
标准普通对象
- Object普通对象:{}
标准特殊对象
- Array数组对象
- RegExp正则对象
- Date日期对象
- Error错误对象
- Set/Map
- Math数学对象
- JSON对象
- ArrayBuffer DataView
- function* num(){}
- Promise Proxy Reflect
- ...
可调用对象
- Function
非标准特殊对象
- Number
- String
- Boolean
- Symbol
- Bigint
- ...
咳咳~当然面试官不需要你说这么多,你只需要知道七大简单与一大object就行了,
创建变量的方式
字面量方式
let n = '1'
// typeof n => 'string'
构造函数方式
let n = new String(1);
// typeof n = 'object'
包装对象方式
String(1)
// typeof n = 'string'
检测机制typeof
ECMAScript提供的内置类型在计算机底层都是以二进制数据存储的,那么我们typeof的检测机制自然也是如此
演示
先来说说typeof的局限性,我们看到typeof {} 与typeof []他们都是一个object,在实际开发中我们需要准确拿到类型值,故而typeof检测是有弊病的,另外typeof null是一个object这是一个bug,今天我们就来说一说为何如此,原来用typeof检测数据,会调用内部方法Getvalue方法,按照计算机数据存储方式检测的。
计算机底层数据存储
ECMAScript规定在计算机内存中
1:整数数字010:浮点数100:字符串110:布尔-2^30:undefined000000:null000:对象 根据上面所说,typeof检测null的时候,会把000当做对象处理,故而有typeof null是"object"。- 如果是检测可调用对象,则返回
'function',因为在检测的时候会去检测有没有实现call方法,有call则是'function',没有则是'object'。 - 如果检测未被定义的变量,则不会报错。
回到上一个问题,我要准确拿到某个变量的准确类型,
typeof明显是不合适的,基于这个我们还有instanceof、constructor、Object.prototype.toString.call()
等等之类的检测方法,这里暂且不谈。