导读内置类型原型

JS 中分为七种内置类型,七种内置类型又分为两大类型:基本类型对象,基本类型有六种: nullundefinedbooleannumberstringsymbol,对象类型有:objectarrayfunction

JS中的number类型都是浮点数,基于 IEEE 754标准实现,因此在前端直接做金融方面的数字处理是不严谨的(禁止使用),此外NaN属于特殊的number类型;

null属于特殊的对象,文档可以参考这里,原因是JS第一版的设计是使用32bit来存储数值的,且是通过值的低1位或3位来识别类型的,使用C/C++的宏定义实现,机器码为000;

000:引用类型(Object);

001:整形(Integer);

010:双精度浮点型(Double);

110:布尔值(Boolean);

可以看出000开头是表示引用类型(即对象),而null是000,因此被误认为是对象了,更多参考文档《The History of "Typeof null"》;

也曾有人给EcmaScript提过让typeof null === 'null',被拒绝了~参考提案链接

typeof

对于基本类型,除了null都可以显示正确的类型(null属于特殊的对象);

typeof 123; // 'number'
typeof '123'; // 'string'
typeof undefined; // 'undefined'
typeof true; // 'boolean'
typeof Symbol(); // 'symbol'
typeof abc; // abc没有声明,会显示undefined

对于对象,除了函数都会显示object

typeof []; // 'object'
typeof {}; // 'object'

typeof console.log; // 'function'
typeof null; // object

我们可以看到,对于nulltypeof也识别成了object,这是不准确的,在后续的调用可能会发生异常。那么如何正确的识别自变量的类型呢?我们可以参考一下以下方法:

export const objectToString = Object.prototype.toString;
export const toTypeString = (value) => objectToString.call(value);
export const toRawType = (value) => toTypeString(value).slice(8, -1);

当然,我们也可以通过下面的instanceof操作符来判断类型

instanceOf

instanceof可以正确的判断对象的类型,因为它的实现原理是通过判断对象的原型链中是否能含有对应类型的prototype