1.基本数据类型:
Js基本数据类型一般分为五种:string、boolean、number、null和undefined。我们可以使用typeof来检测不同的数据类型。很多时候,我们将null归结为是一种object类型。
var str="字符串"; var istrue=true; var num=25; var undef=undefined; var nul=null; console.log(typeof str);//string console.log(typeof istrue);//boolean console.log(typeof num);//number console.log(typeof undef);//undefined console.log(typeof nul);//object
(1)undefined类型:
当变量已经声明,但是没有获得定义,或者变量被定义成undefined、检测一个并没有声明过的变量时,三种情况下,typeof返回的都是undefined,因此我们可以看出,typeof并不能正确的检测数据类型。尤其是对于那些声明未赋值和未声明的变量。
var undef=undefined; var undef2; console.log(typeof undef);//变量声明后,被赋值为undefined console.log(typeof undef2);//变量声明后,没有赋值 console.log(typeof undef3)//变量并没有声明
(2)null类型:
在使用typeof检测null类型时,返回的是object。从逻辑角度来看,null 值表示一个空对象指针,而这也正是使用typeof操作符检测null值时会返回"object"的原因。
此外,null在不规范的相等检测时,返回的为true。在大部分的时候,我们都没有必要将变量声明为undefined。
var nul=null; console.log(typeof nul);//null表示的是一个空对象的指针,因此typeof检测返回的是object
2.引用类型:
在ECMAScript中,Object表示就是一组数据和功能的集合。从定义中我们可以看出数组肯定是Object类型。
var obj=new Object(); var obj2=[‘1‘,‘2‘]; var obj3=new Date(); var obj4=/[0~9]/; console.log(typeof obj);//Object类型 console.log(typeof obj2);//数组 console.log(typeof obj3);//日期类型 console.log(typeof obj4);//正则类型
3.类型检测:
在上一节中我们使用typeof来进行类型检测,但是在检测null和undefined类型的时候,typeof的弊端已经显现无遗。typeof的弊端不仅仅表现在此时,试想,当我们检测两种不同的Object类型的数据时,如何区分不同的对象类型。例如:
var person={}; var lists=[‘a‘,‘b‘,‘c‘]; console.log(typeof person);//object console.log(typeof lists);//object
ECMAScript中提供了另一个类型检测的方法instanceof。Instanceof主要用来对象之间的类型检测,例如如下我们定义一个构造函数,Person返回的是一个Person对象:
var list=[‘a‘,‘b‘,‘c‘]; function Person(name,age){ this.name=name; this.age=age; }; var Cowen=new Person(‘Cowen‘,27); console.log(list instanceof Array);//true console.log(Cowen instanceof Person);//true
针对基本数据类型我们使用typeof来判断数据类型,而对于对象类型object,我们使用instanceof。是否存在一种盘点方法让我们既可以判断基本类型页可以判断引用类型呢?
当然是存在的,我们可以利用单体类型的构造器constructor来判断数据类型,对于基本数据类型,其对应的单体类型一般为String、Number、Boolean,而引用类型中,数组对应的单体对象为Array,而其他对象都会对应的有各自的构造器constructor。
var str="字符串"; console.log(str.constructor==String);//字符串 var list=[]; console.log(list.constructor==Array);//数组 function Person(){}; Person.prototype={ constructor:Person, name:"no", age:18 } var Cowen=new Person(); console.log(Cowen.constructor==Person);//对应的Person
当然,对于所有的元素,我们都可以使用toString()方法,因此可以利用call传递参数来判断元素的原始类型。
var str="字符串"; var list=[]; function Person(){}; Person.prototype={ constructor:Person, name:"no", age:18 }; var Cowen=new Person(); var getType=function(obj){ return Object.prototype.toString.call(obj); }; console.log(getType(str));//[object String] console.log(getType(list));//[object Array] console.log(getType(Cowen));//[object Object]
4.类型转换:
js中常见的类型转换一般是基本类型之间的转换,尤其以数字类型的转换尤多,因此我们只考虑数字之间的转换。数字类型转换的函数有两个number()、parseInt()。二者之间有很大的区别:
对于null,number()转换返回的是0,而parseInt()返回的是NaN。
对于undefined类型,二者返回的都是NaN。
var str="123kkk"; console.log(Number(str));//NaN console.log(parseInt(str));//123 console.log(Number(undefined));//NaN console.log(parseInt(undefined));//NaN console.log(Number(null));//0 console.log(parseInt(null));//NaN
NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。针对NaN 的这两个特点,ECMAScript 定义了isNaN()函数。这个函数接受一个参数,该参数可以是任何类型,而函数会帮我们确定这个参数是否“不是数值”。
小结:
1.js基本数据类型一般分为五种:string、boolean、number、null和undefined。 |
2.null 值表示一个空对象指针,null是object类型。 |
3.类型检测一般存在三种方法: (1)使用typeof检测基本数据类型; (2)使用instanceof检测引用类型; (3)使用constructor构造器判断元素对应的基类型; (4)使用toString()方法来判断。 |