欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

js类型判断的几种方法

程序员文章站 2024-01-10 14:24:16
...

js类型判断的几种方法

/** JS中 判断一个变量类型的几种方式
 * 1. typeof  没法区分对象类型.  数组, object
 * 2. Object.prototype.toString.call()
 * 3. instanceof
 * 4. constructor
 */

要说到 JS 类型判断的几种方式, 我们就需要知道 JS 有哪些数据类型

# ES5阶段, 数据类型有6: string, boolean, number, null, undefined, object
# es6 新增了 Symbol

# 所以 JS 数据类型有
	string, Boolean, number, null, undefined, object, symbol

typeof 操作符

typeof 操作符判断变量类型一般主要用来检测基本数据类型

typeof "123"   => "string"
typeof false   => "boolean"
typeof 123 		 => "number"
typeof undefined => "undefined"

# ---------------------------------
typeof null    => "object"
typeof {}      => "object"
typeof []      => "object"
// 所以我们看到, 当 typeof 操作符, 返回是 object 的时候, 变量可能是 null 和 数组,这种情况我们要注意, 尤其 typeof null = "object" 
#-----------------------------------
typeof function(){}   ==> "function"

Object.prototype.toString.call() 方法

每个对象都有一个 toString() 方法, 默认情况下,toString() 方法被每个 Object 对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 “[object type]”,其中 type 是对象的类型。(上述文字来自于MDN Object.prototype.toString()方法介绍) 代码介绍如下:

var o = new Object();
Object.prototype.toString.call(o) // returns "[object Object]"

???? MDN 上也有关于使用 Object.prototype.toString 方法进行对象的类型检测说明.

Object.prototype.toString.call("Gene")  // "[object String]"
Object.prototype.toString.call(true)    // ""[object Boolean]"
Object.prototype.toString.call(4)       // "[object Number]"
Object.prototype.toString.call(null)    // "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call({})        // "[object Object]"
Object.prototype.toString.call(function(){}) // "[object Function]"
Object.prototype.toString.call([])           // "[object Array]"



Object.prototype.toString.call(/\w/)         // "[object RegExp]"
Object.prototype.toString.call(Dog)         //  "[object Function]"

# 注意: MDN上有说过, Date 对象直接调用的时候, 返回的是  #字符串#. 
Object.prototype.toString.call(new Date)     // "[object Date]"
Object.prototype.toString.call(Date())       // "[object String]"

instanceof 操作符

MDN:

用法:object instanceof constructor

描述: instanceof 运算符用来检测 constructor.prototype是否存在于参数 object 的原型链上。

// 从MDN上我们可以得知, instanceof 主要用来检测引用类型. 它用来判断,  当前的 constructor 构造函数, 是否在 object 实例的原型链上, 存在就是 true. 不存在就是 false

  let obj = {};
  console.log(obj instanceof Object);       // true
  let arr = []
  console.log(arr instanceof Array);        // true
  let fn = function() {}; 
  console.log(fn instanceof Function);      // true

constructor 构造函数

js中,函数定义的时候, js引擎会为这个函数添加一个 prototype 属性, prototype 属性是一个对象, 我们称之为原型对象.

原型对象prototype 上有一个 constructor 属性, 这个属性指向函数本身. 这就是我们所说的 constructor 构造函数

// 
''.constructor==String				// => true

false.constructor==Boolean
true.constructor==Boolean			// => true

new Number(1).constructor ==Number	// => true

[].constructor==Array								// true