判断js中的数据类型

如何判断js中的数据类型:typeof、instanceof、 constructor、 prototype方法比较

如何判断js中的类型呢,先举几个例子:

var a = "iamstring.";

var b = 222;

var c= [1,2,3];

var d = new Date();

var e = function(){alert(111);};

var f = function(){this.name="22";};

 

最常见的判断方法:typeof

alert(typeof a)   ------------> string

alert(typeof b)   ------------> number

alert(typeof c)   ------------> object

alert(typeof d)   ------------> object

alert(typeof e)   ------------> function

alert(typeof f)   ------------> function

其中typeof返回的类型都是字符串形式,需注意,例如:

alert(typeof a == "string") -------------> true

alert(typeof a == String) ---------------> false

另外typeof 可以判断function的类型;在判断除Object类型的对象时比较方便。

 

判断已知对象类型的方法: instanceof

alert(c instanceof Array) ---------------> true

alert(d instanceof Date) 

alert(f instanceof Function) ------------> true

alert(f instanceof function) ------------> false

注意:instanceof 后面一定要是对象类型,并且大小写不能错,该方法适合一些条件选择或分支。

 

根据对象的constructor判断: constructor

alert(c.constructor === Array) ----------> true

alert(d.constructor === Date) -----------> true

alert(e.constructor === Function) -------> true

注意: constructor 在类继承时会出错

eg,

      function A(){};

      function B(){};

      A.prototype = new B(); //A继承自B

      var aObj = new A();

      alert(aobj.constructor === B) -----------> true;

      alert(aobj.constructor === A) -----------> false;

而instanceof方法不会出现该问题,对象直接继承和间接继承的都会报true:

      alert(aobj instanceof B) ----------------> true;

      alert(aobj instanceof B) ----------------> true;

言归正传,解决construtor的问题通常是让对象的constructor手动指向自己:

      aobj.constructor = A; //将自己的类赋值给对象的constructor属性

      alert(aobj.constructor === A) -----------> true;

      alert(aobj.constructor === B) -----------> false; //基类不会报true了;

 

通用但很繁琐的方法: prototype

alert(Object.prototype.toString.call(a) === ‘[object String]’) -------> true;

alert(Object.prototype.toString.call(b) === ‘[object Number]’) -------> true;

alert(Object.prototype.toString.call(c) === ‘[object Array]’) -------> true;

alert(Object.prototype.toString.call(d) === ‘[object Date]’) -------> true;

alert(Object.prototype.toString.call(e) === ‘[object Function]’) -------> true;

alert(Object.prototype.toString.call(f) === ‘[object Function]’) -------> true;

### JavaScript 数据类型判断方法 #### 使用 `typeof` 运算符 对于基本数据类型判断,`typeof` 是一种常用的方法。它可以识别出大多数原始数据类型,如字符串、数值、布尔值等。然而,对于某些特殊情况,其返回的结果可能不符合预期。 ```javascript console.log(typeof "hello"); // string console.log(typeof 42); // number console.log(typeof true); // boolean console.log(typeof undefined); // undefined console.log(typeof null); // object (这是一个已知的错误) ``` [^1] #### 应用 `instanceof` 关键字 当涉及到对象实例时,`instanceof` 可用于检测某个对象是否属于特定构造函数的实例。这种方法不适合用来测试基本数据类型。 ```javascript let date = new Date(); console.log(date instanceof Date); // true ``` [^2] #### 调用 `Object.prototype.toString.call()` 方法 这是最为推荐的一种方式来获取任何给定值的确切内部标签(即它的[[Class]]属性)。该技术能够可靠地区分所有的内置以及自定义的对象和原始类型。 ```javascript function getType(value){ return Object.prototype.toString.call(value).slice(8,-1); } console.log(getType([])); // Array console.log(getType({})); // Object console.log(getType(null)); // Null console.log(getType(undefined));// Undefined ``` [^3] #### 利用 `.constructor` 属性 每个 JavaScript 对象都有一个 constructor 属性,默认情况下它指向创建该对象原型的那个构造器函数。不过要注意的是,在跨框架或库的情况下可能会出现问题,因为这些环境有时会改变默认的行为。 ```javascript const num = 5; console.log(num.constructor === Number); // true ``` #### 实现严格相等运算符 (`===`) 虽然这并不是专门为了类型检查而设计的操作符,但是在很多场景下可以直接通过比较两个操作数之间的绝对相同来进行简单的真假判定。 ```javascript var a = null; if(a === null){ console.log('a is null'); }else{ console.log('a has value'); } // 输出:"a is null" ``` 综上所述,针对不同的需求可以选择合适的方式来进行 JavaScript 中的数据类型判断。每种手段各有优劣,开发者应根据实际情况灵活选用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值