JS基础 - 判断数据类型
如何准确的判断值的具体数据类型
JS 的数据类型分为基本类型和引用类型
基础类型存储在栈内存,被引用或拷贝时,会创建一个完全相等的变量;占据空间小、大小固定,属于被频繁使用数据,所以放入栈中存储。
引用类型存储在堆内存,存储的是地址,多个引用指向同一个地址,这里会涉及一个“共享”的概念;占据空间大、大小不固定。引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。
基本类型:String、Number、BigInt、Boolean、Symbol、Undefined、Null
引用类型:Object
Object 类型又包含:Function、Array、RegExp、Date、Math
typeof
若使用typeof
来判断数据类型
基础类型:能够正确判断除了 Null 以外的所有基础类型;
引用类型:能够正确判断 Function 类型,其他一律返回 Object;
typeof ''; // string 正确
typeof 1; // number 正确
typeof Symbol(); // symbol 正确
typeof true; // boolean 正确
typeof undefined; // undefined 正确
typeof null; // object 错误
typeof new Function(); // function 正确
typeof Function; // function 正确
typeof new Date(); // object 错误
typeof Date; // 此处是构造函数,所以返回 function
typeof new RegExp(); // object 错误
typeof [] ; // object 错误
instanceof
X instanceof Y
用于判断 X 是否是 Y 的实例,instanceof 无法判断基本数据类型,但是能够判断引用数据类型。
'' instanceof String; // false
2 instanceof Number; // false
Symbol() instanceof Symbol; // false
true instanceof Boolean; // false
[] instanceof Array; // true
let a = function(){}; a instanceof Function; // true
let b = new Date(); b instanceof Date; // true
let c = new RegExp(); c instanceof RegExp; // true
toString
toString()
是 Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]] 。这是一个内部属性,其格式为 [object Xxx] ,其中 Xxx 就是对象的类型。
Object.prototype.toString.call(''); // [object String]
Object.prototype.toString.call(1) ; // [object Number]
Object.prototype.toString.call(true); // [object Boolean]
Object.prototype.toString.call(Symbol()); //[object Symbol]
Object.prototype.toString.call(undefined); // [object Undefined]
Object.prototype.toString.call(null); // [object Null]
Object.prototype.toString.call(new Function()); // [object Function]
Object.prototype.toString.call(new Date()); // [object Date]
Object.prototype.toString.call([]); // [object Array]
Object.prototype.toString.call(new RegExp()); // [object RegExp]
Object.prototype.toString.call(new Error()); // [object Error]
Object.prototype.toString.call(document); // [object HTMLDocument]
Object.prototype.toString.call(window); //[object global] window 是全局对象 global 的引用
JS基础 - 判断数据类型