JavaScript中数据类型的判断总结

上篇文章讲解了JavaScript中的数据类型,这篇文章将讲解该如何判断一种变量的数据类型。常用的判断变量数据类型的方法有typeof操作符、constructor、instanceof及toString方法,下面将一一讲解。

1.typeof操作符

使用typeof操作符检测出的结果为一个字符串,包括"undefined","string","number","boolean","object","function"等。下面代码列出一些基本类型的检测结果。

typeof ""           // "string"
typeof 20           // "number"
typeof true         // "boolean"
typeof NaN          // "number"
typeof undefined    // "undefined"
typeof null         // "object"
typeof []           // "object"
typeof Number       // "function"
typeof Math         // "object"
typeof {}           // "object"

可以看到基本数据类型除了null之外,都会返回正确的结果,而复杂数据类型返会返回"object"或者"function"类型。但需要注意的是,若变量是用new创建的,则使用typeof检测的时候,返回的结果即为"object",如下:

var a = new Number(10)
typeof a // "object"

2.constructor

constructor对象能检测出变量的构造函数,如下边几个例子:

var a = 10
a.constructor === Number    // true
"".constructor === String   // true
true.constructor === Boolean // true
[].constructor === Array    // true
var obj = {}
obj.constructor === Object  // true
document.constructor === HTMLDocument // true

由于null和undefined是无效的对象,所以没有constructor。可以看到的是,constructor对象似乎能够检测到所有的变量类型?但是,需要注意的事情是,对象的constructor是可以更改的,如下:

function Foo(){}
Foo.prototype = {name:'zhangsan'}
var f1 = new Foo()
f1.constructor === Foo     //false
f1.constructor === Object  // true

首先创建一个Foo构造函数,然后改变它的prototype为Object的实例,再使用Foo创建一个实例的时候,发现该实例的constructor指向Object而并非Foo,所以constructor检测数据类型的时候并不是很可靠,一般不推荐使用。

3.instanceof

使用方法: a instanceof B 用来判断a是否为B的一个实例,如下:

[] instanceof Array   // true
"" instanceof String  // false 
var str = new String("123")
str instanceof String // true
2 instanceof Number // false
var num = new Number(2)
num instanceof Number // true
Math instanceof Object // true
Array instanceof Object // true
Date instanceof Function // true

可以看到有些类型使用判断的结果并不一定正确,且有些类型是没有办法使用instanceof来判断的,如null和undefined.

4.toString

Object.prototype.toString.call()可以用于检测各种类型的变量,且返回的结果是一定正确的,jQuery即使用该方法来判断变量类型,Array.isArray()方法底层也是使用这种方式来判断是否是数组的。看以下例子:

Object.prototype.toString.call("")        //  "[object String]"
Object.prototype.toString.call(2)         //  "[object Number]"
Object.prototype.toString.call(true)      //  "[object Boolean]"
Object.prototype.toString.call(null)      //  "[object Null]"
Object.prototype.toString.call(undefined) //  "[object Undefined]"
Object.prototype.toString.call(window)    //  "[object Window]"
Object.prototype.toString.call(document)  //  "[object HTMLDocument]"

可以看到Object.prototype.toString.call()可以正确返回各种类型的数据,所以一般若要正确检测数据类型,推荐使用这种方法来检测。

JavaScript的数据类型分类、存储及判断的总结就到此为止。有不正确的地方欢迎指正~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值