数据类型检测typeof/instanceof/constructor/object.prototype.tostring.call()

概览:

typeof [val] 用于检测数据类型的运算符
instanceof 用于检测当前实例是否率属于某个类
constructor 基于构造函数检测数据类型(也是基于类的方式)
object.prototype.toString.call() 检测数据类型最完善的办法


typeof是一个一元运算符,它返回的结果 始终是一个字符串,对不同的操作数,它返回不同的结果。
typeof Symbol() //"symbol"
typeof Number() //"number"
typeof String() //"string"
typeof Function() //"function"
typeof Object() //"object"
typeof Boolean() //"boolean"
typeof null //"object"
typeof undefined //"undefined"

具体的规则如下:

  • 对于数字类型的操作数而言, typeof 返回的值是 number。比如说:typeof(1),返回的值就是number。

上面是举的常规数字,对于非常规的数字类型而言,其结果返回的也是number。比如typeof(NaN),NaN在 JavaScript中代表的是特殊非数字值,虽然它本身是一个数字类型。
在JavaScript中,特殊的数字类型还有几种:

     Infinity  表示无穷大特殊值 
     NaN     特殊的非数字值 
     Number.MAX_VALUE   可表示的最大数字 
     Number.MIN_VALUE    可表示的最小数字(与零最接近) 
     Number.NaN     特殊的非数字值 
     Number.POSITIVE_INFINITY      表示正无穷大的特殊值 
     Number.NEGATIVE_INFINITY       表示负无穷大的特殊值 

这些特殊类型,在用typeof进行运算进,其结果都将是number。

  • 对于字符串类型,typeof 返回的值是 string。比如typeof("123")返回的值是string。

  • 对于布尔类型,typeof 返回的值是 boolean 。比如typeof(true)返回的值是boolean。

  • 对于对象、数组、null 返回的值是 object 。比如typeof(window),typeof(document),typeof(null)返回的值都是object。

  • 对于函数类型,返回的值是 function。比如:typeof(eval),typeof(Date)返回的值都是function。

  • 如果运算数是没有定义的(比如说不存在的变量、函数或者undefined),将返回·undefined·。比如:typeof(sss)、typeof(undefined)都返回undefined。

具体如下:

// Numbers
typeof 37 === 'number';
typeof 3.14 === 'number';
typeof Math.LN2 === 'number';
typeof Infinity === 'number';
typeof NaN === 'number'; // 尽管NaN是"Not-A-Number"的缩写
typeof Number(1) === 'number'; // 但不要使用这种形式!

// Strings
typeof "" === 'string';
typeof "bla" === 'string';
typeof (typeof 1) === 'string'; // typeof总是返回一个字符串
typeof String("abc") === 'string'; // 但不要使用这种形式!

// Booleans
typeof true === 'boolean';
typeof false === 'boolean';
typeof Boolean(true) === 'boolean'; // 但不要使用这种形式!

// Symbols
typeof Symbol() === 'symbol';
typeof Symbol('foo') === 'symbol';
typeof Symbol.iterator === 'symbol';

// Undefined
typeof undefined === 'undefined';
typeof declaredButUndefinedVariable === 'undefined';
typeof undeclaredVariable === 'undefined'; 

// Objects
typeof {a:1} === 'object';

// 使用Array.isArray 或者 Object.prototype.toString.call
// 区分数组,普通对象
typeof [1, 2, 4] === 'object';
typeof /^/   === 'object'
typeof new Date() === 'object';

// 下面的不要使用!
typeof new Boolean(true) === 'object';
typeof new Number(1) === 'object';
typeof new String("abc") === 'object';

// 函数
typeof function(){} === 'function';
typeof class C{} === 'function'
typeof Math.sin === 'function';
typeof new Function() === 'function';

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容