在讲typeof和instanceof之前,还是要先讲下JavaScript中的几种数据类型。JavaScript有5种简单的数据类型(基本类型):Undefined、Null、Boolean、Number和String,还有一种复杂的数据类型-Object。

Undefined类型

Undefined类型的值为undefined。当使用var声明变量但为对其初始化时,这个变量的值即为undefined:

var a;
console.log(a == undefined);//true

Null类型

Null类型的值为null。从逻辑角度看,null值表示一个空对象指针,因此,使用typeof检测null时会返回“object”:

var a = null;
console.log(typeof a);//"object"

实际上,undefined值是派生自null值的,因此ECMA-262规定对它们的相等性测试要返回true

console.log(undefined == null);//true

尽管null和undefined有这样的关系,但它们的用途完全不同。无论在什么情况下都没必要把一个变量的值显示的设置为undefined,可是同样的规则对null并不适用。

Boolean类型

Boolean类型的值有两个,true和false。这两个值与数字值不是一回事,因此true不一定等于1,而false不一定等于0。可以调用类型转换函数(Boolean())讲任意类型的值转换为对应的Boolean类型的值:

数据类型 转换为true的值 转换为false的值
Boolean true false
String 任何非空字符串 空字符串
Number 任何非0数字值 0和NaN
Object 任何对象 null
Undefined n/a(不适用) undefined

Number类型

Number类型用来表示整数和浮点数值,以及NaN。在javascript中任何值除以0都会返回NaN而不会发生异常。

javascript中有一个isNaN()函数,这个函数接受一个参数,该参数可以是任何类型,而函数会返回这个值是否不为数值。即任何不能转换为数值的参数输入,都会返回true。

console.log(isNaN(NaN));    //true
console.log(isNaN(10));	    //false
console.log(isNaN("10"));   //false
console.log(isNaN("blue")); //true
console.log(isNaN(true));   //false

Number()、parseInt()、parseFloat(),这三个函数可以把非数值,但是能转换为数值的数据类型转换为数值。其中,Number()函数对任何类型都可以使用,而parseInt()和parseFloat()只能传入字符串类型的参数。

Number()函数的转换规则:

  • 1.如果是Boolean值,true和false将分别被替换为1和0
  • 2.如果是数字值,只是简单的传入和返回
  • 3.如果是null值,返回0
  • 4.如果是undefined,返回NaN
  • 5.如果是字符串,遵循下列规则:
  • ·5.1如果字符串中只包含数字,则将其转换为十进制数值,前导的0会被忽略
  • ·5.2如果字符串中包含有效的浮点格式,则将其转换为对应的浮点数
  • ·5.3如果字符串中包含有效的十六进制格式,如“0xf”,则将其转换为相同大小的十进制整数值
  • ·5.4如果字符串是空的,则将其转换为0
  • ·5.5如果字符串中包含除了上述格式之外的字符,则将其转换为NaN
  • 6.如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果为NaN,则调用对象的toString()方法,然后依照前面的规则转换返回的字符串

由于Number()函数在转换字符串时比较复杂而且不够合理,因此在处理整数的时候更常使用的是parseInt()函数。parseInt()函数在转换字符串时,更多的是看其是否符合数值模式。它会忽略字符串前面的空格,直至找到第一个非空字符。如果第一个字符不是数字字符或负号,parseInt()会返回NaN;也就是说,用parseInt()转换空字符串会返回NaN。如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或遇到了一个非数字字符。如,“1234blue”会被转换为1234,“22.5”会被转换为22。

parseInt()能够将正确的十六进制或八进制的数字字符串转换为十进制的数值。

parseInt()有第二个参数,告诉函数,第一个参数,以第二个参数的标准转换为十进制的数值。

parseInt("10",2);       //2(按二进制解析)
parseInt("10",8);       //8(按八进制解析)
parseInt("AF",16);      //175(按十六进制解析)

parseFloat()函数,将十进制的浮点数的字符串转换为数值型的浮点数。parseFloat()函数会忽略前导的0。

String类型

String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。字符串可以由单引号或双引号表示。要把一个值转换为一个字符串有两种方式。第一种是使用toString()方法。

数值、布尔值、对象和字符串都有toString()方法,但null和undefined没有这个方法。其中数值在使用toString()方法时可以传递一个参数:输出数值的基数。

var num = 10;
console.log(num.toString());        //"10"
console.log(num.toString(2));       //"1010"
console.log(num.toString(8));       //"12"
console.log(num.toString(10));      //"10"
console.log(num.toString(16));      //"a"

第二种方式,使用String()函数转换为字符串。这个函数能够将任何类型的值转换为字符串,包括null和undefined。String()函数对其他类型的转换同上面的toString()方法,而对于null,会转换为“null”,对于undefined会转换为“undefined”。

Object类型

对象是一组键/值对的集合。对象可以通过new操作符来创建。

var obj = new Object();

Object的每个实例都具有下列属性和方法:

  • constructor —— 保存着用于创建当前对象的函数
  • hasOwnProperty(propertyName) —— 用于检查给定的属性在当前对象实例中是否存在。其中,参数必须以字符串的形式指定
  • isPrototypeOf(object) —— 用于检查传入的对象是否是另一个对象的原型
  • propertyIsEnumerable(propertyName) —— 用于检查给定的属性是否能够使用for-in语句来枚举
  • toString() —— 返回对象的字符串表示
  • valueOf() —— 返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同

typeof与instanceof使用

typeof用于获取一个变量或表达式的类型,typeof一般只返回以下的结果:

  • number
  • boolean
  • string
  • function
  • object(null,数组,对象)
  • undefined

因为对null、数组和对象使用typeof时,返回的都是object,因而需要判断某个变量是对象还是数组时就需要使用instanceof了。

instanceof用于判断一个变量是否为某个对象的实例。

var a = new Array();
console.log(a instanceof Array);     //true
console.log(a instanceof Object);    //true

因为Array是Object的子类。那么如何来判断某个变量是对象还是数组呢?

console.log(a instanceof Array);     //返回true则变量是数组,返回false则判断下一条
console.log(a instanceof Object);    //返回true则是对象不是数组,返回false则既不是对象也不是数组