判断数据类型的几种方式
- 基本类型:String、Number、Boolean、Symbol、Undefined、Null
- 引用类型:Object
typeof
- 对于基本类型,除 null 以外,均可以返回正确的结果。
- 对于引用类型,除 function 以外,一律返回 object 类型。
- 对于 null ,返回 object 类型。
- 对于 function 返回 function 类型。
- 只返回了处于其原型链最顶端的 Object 类型
示例
typeof ""; //String
typeof: 1; // Number
typeof Symbol(); // symbol
typeof false; //Boolean
typeof undefined: //undefined
typeof null; // Object
typeof Function(); // function
typeof [] ; //object
typeof new Function(); // function
typeof new Date(); //object
typeof new RegExp(); //object
instanceof
无法区分自定义对象类型,自定义类型可以采用instanceof区分
== instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型。==
从 instanceof 能够判断出 [ ].proto 指向 Array.prototype,而 Array.prototype.proto 又指向了Object.prototype,最终 Object.prototype.proto 指向了null,标志着原型链的结束。因此,[]、Array、Object 就在内部形成了一条原型链:
从原型链可以看出,[] 的 proto 直接指向Array.prototype,间接指向 Object.prototype,所以按照 instanceof 的判断规则,[] 就是Object的实例。依次类推,类似的 new Date()、new Person() 也会形成一条对应的原型链 。
示例
[] instanceof Array; // true
{} instanceof Object;// true
new Date() instanceof Date;// true
function Person(){};
new Person() instanceof Person;
[] instanceof Object; // true
new Date() instanceof Object;// true
new Person instanceof Object;// true
constructor
检查实例对象的constructor是否等于类原型
-
null 和 undefined 是无效的对象,因此是不会有 constructor 存在的,这两种类型的数据需要通过其他方式来判断。
-
函数的 constructor 是不稳定的,这个主要体现在自定义对象上,当开发者重写 prototype 后,原有的 constructor 引用会丢失,constructor 会默认为 Object
Object.prototype.toString.call()
背景
- 在JavaScript里使用typeof判断数据类型,只能区分基本类型,即:number、string、undefined、boolean、Symbol。
对于null、array、function、object来说,使用typeof都会统一返回object字符串。 - 要想区分对象、数组、函数、单纯使用typeof是不行的。在JS中,可以通过Object.prototype.toString方法,判断某个对象之属于哪种内置类型。分为null、string、boolean、number、undefined、array、function、object、date、math。
例子
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 的引用
作者:yinxmm
链接:https://www.jianshu.com/p/4c92eb5eb361
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。