首页 > 代码库 > JS中的数据类型检测

JS中的数据类型检测

JavaScript的数据类型分为两类:原始类型(primitive type)和对象类型(object type)。原始类型有5种,分别是:数字(Number)、字符串(String)、布尔值(Boolean)、null和undefined。引用类 型包括:Object、Array、Date、Error、RegExp、Functions。

1.原始类型的检测

对于原始类型中的:数字、字符串、布尔值、undefined,最佳检测方法是使用typeof运算符,typeof检测后会返回一个表示值类型的字符串。typeof的语法是:

typeof <变量>
typeof(<变量>)

对以上4种原始值使用typeof运算符后:数字返回"number" 、    字符串返回"string" 、    布尔值返回"boolean" 、    undefined返回"undefined"。如下:

var str = ‘a string‘;console.log(typeof str);           //      ->   stringvar num = 0;console.log(typeof num);           //      ->   stringvar bool = true;console.log(typeof bool);          //      ->   booleanvar undefin;console.log(typeof undefin);               //      ->   undefined  未定义的变量和未初始化的变量都将返回undefined

原始值null,应当使用===和!==进行行比较,对null做typeof检测时,返回值为"object"。

2.引用类型的检测

引用值也称做对象(object),在JavaScript中除原始类型外都是引用类型。typeof运算符不能有效检测引用类型,所有引用类型都会返回“object”:

console.log(typeof []);              //      ->   objectconsole.log(typeof new Date());           //      ->   objectconsole.log(typeof {});                //      ->   objectconsole.log(typeof new Error());    //    ->   objectconsole.log(typeof new RegExp());    //   ->   objectconsole.log(typeof Function);    //    ->   function

引用类型检测推荐使用instanceof运算符,基本语法是:

value instanceof constructor

对引用类型做instanceof操作:

console.log([] instanceof Array);                //      ->   trueconsole.log(new Date() instanceof Date);        //       ->   trueconsole.log({} instanceof Object);            //      ->   trueconsole.log(new Error() instanceof Error);       //      ->   truevar reg = new RegExp();console.log(reg instanceof RegExp);             //   ->   truefunction func (argument) {}console.log(func instanceof Function)           //     ->   true

对于函数做typeof操作返回function,相比intanceof更推荐使用typeof。

对象属性检测

判断属性是否存在最好的方法是使用in运算符,如果属性存在或继承自原型链,都会返回true。如果只想检测对象实例是否存在某属性,而不是从原型继承的属性则使用hasOwnProperty()方法。如下:

function Person() {    this.name = ‘liuht‘;    this.doSometing = function() {        return ‘doSometing‘;    }}Person.prototype.area = ‘China‘;              // 原型链属性var man = new Person();man.sex = ‘man‘;console.log(‘name‘ in man);           //         -> trueconsole.log(‘sex‘ in man);            //      -> trueconsole.log(‘area‘ in man);           //      -> trueconsole.log(man.hasOwnProperty(‘name‘));                //      -> trueconsole.log(man.hasOwnProperty(‘sex‘));                 //      -> trueconsole.log(man.hasOwnProperty(‘area‘));                        //      -> false

JS中的数据类型检测