有几种数据类型

JavaScript语言的每一个值,都属于某一种数据类型。JavaScript的数据类型,共有六个类别和两个特殊值。

六个类别的数据类型又可以分成两组:原始类型(primitive type)和合成类型(complex type)。

原始类型(也叫值类型,把一个值类型传递给另一个变量(赋值)时,其实是分配了一块新的内存空间)包括:

  1. number
  2. string
  3. boolean

合成类型(也叫引用类型,引用类型变量的交换其实是交换了指像同一个内容的地址)包括:

  1. object
  2. array
  3. function

两个特殊值:

  1. null
  2. undefined

这里需要明确的是,JavaScript的所有数据,都可以视为对象。不仅合成类型的数组和函数属于对象的特例,就连原始类型的数据(数值、字符串、布尔值)也可以用对象方式调用。

如何判断数据类型

JavaScript有三种方法,可以确定一个值到底是什么类型。

  1. typeof运算符
  2. instanceof运算符
  3. Object.prototype.toString方法

typeof运算符有六种返回结果,string、number、boolean、function、undefined和object

  1. 数值、字符串、布尔值分别返回number、string、boolean

    1
    2
    3
    typeof 123 // "number"
    typeof "123" // "string"
    typeof false // "boolean"
  2. 函数返回function

    1
    2
    3
    // 定义一个空函数
    function f(){}
    typeof f // "function"
  3. undefined返回endefindd

    1
    typeof undefined // "undefined"
  4. 除此之外,都返回object

    1
    2
    3
    4
    typeof window // "object"
    typeof {} // "object"
    typeof [] // "object"
    typeof null // "object"

instanceof运算符只有两种返回的结果,true和false

  1. instanceof运算符用来确定一个对象是否是某个构造函数的实例。instanceof运算符的左边放置对象,右边放置构造函数。在JavaScript之中,只要是对象,就有对应的构造函数。因此,instanceof运算符可以用来判断值的类型。

    1
    2
    3
    [1, 2, 3] instanceof Array // true
    ({}) instanceof Object // true
    (function(){}) instanceof Function //true
  2. 需要注意的是,由于原始类型的值不是对象,所以不能使用instanceof运算符判断类型。

    1
    "" instanceof String // false
    1 instanceof Number // false
    true instanceof Boolean //false

Object.prototype.toString方法同样有6种返回结果

  1. 数值:返回[object Number]。

    1
    Object.prototype.toString.call(2) // "[object Number]"
  2. 字符串:返回[object String]。

    1
    Object.prototype.toString.call('') // "[object String]"
  3. 布尔值:返回[object Boolean]。

    1
    Object.prototype.toString.call(true) // "[object Boolean]"
  4. undefined:返回[object Undefined]。

    1
    Object.prototype.toString.call(undefined) // "[object Undefined]"
  5. null:返回[object Null]。

    1
    Object.prototype.toString.call(null) // "[object Null]"
  6. 对象:返回[object + “构造函数的名称”] 。

    1
    2
    3
    Object.prototype.toString.call(Math) // "[object Math]"
    Object.prototype.toString.call({}) // "[object Object]"
    Object.prototype.toString.call([]) // "[object Array]"