# 十.数据判断

前言

  • object 是 JavaScript 中所有对象的父对象
  • 数据封装类对象:object、Array、Boolean、Number 和 String
  • 其他对象:Function、Arguments、Math、Data、Error 和 RegExp
  • 其他数据类型:Symbol

# 1.object

# 2.Array

var a = []
Array.isArray(a)
1
2

# 3.检测数据类型的方法

# 3.1 typeof

使用 typeof 检测数据类型,返回的都是一个包含了对应数据类型的字符串,"number"、"string"、"boolean"、"undefined"、"function"、"object"

  • 1.基本数据类型

    console.log(typeof "小明") //'string'
    
    1
  • 2.复杂数据类型

    console.log(typeof typeof typeof function () {}) //‘string’
    console.log(typeof typeof typeof typeof []) //"string"
    
    1
    2
  • 3.typeof 的局限性

    • typeof null -->'object'
    • 不能具体的细分是数组还是正则或对象等其他的值,因为 typeof 检测数据类型,对于对象数据类型的值,最后返回的都是"object"
  • 4.typeof 的应用

    • 函数中赋给参数默认值
    function fn(num1, num2) {
      if (typeof num2 === undefined) {
        num2 = 0
      }
    }
    
    1
    2
    3
    4
    5
    • 回调函数中
    function fn(callback) {
      typeof callback === "function" ? callback() : null
    }
    
    1
    2
    3

# 3.2 instanceof

用来检测某一个实列是否属于某个类

  • 1.基本数据类型

    console.log(new Number(1) instanceof Number) // true
    
    1
  • 2.复杂数据类型

    var obj = [12, 2, 3]
    console.log(obj instanceof Array) // true
    console.log(obj instanceof RegExp) // false
    
    1
    2
    3
    • instanceof 的特性:只要在当前实列的原型链上,我们用其检测都会有
    var ary = []
    console.log(ary instanceof Array) // true
    console.log(ary instanceof Object) // true
    function fn() {}
    console.log(fn instanceof Object) // true
    
    1
    2
    3
    4
    5
  • 3.instanceof 局限性

    • 不能用来检测和处理字面量方式创建出来的基本数据类型
    console.log(1 instanceof Number) // false
    console.log("" instanceof String) // false
    
    1
    2

# 3.3 constructor

找到其构造函数

  • 1.基本数据类型

    console.log(new Number(1).constructor === Number) //true
    
    1
  • 2.复杂数据类型

    var obj = []
    console.log(obj.constructor === Array) //true
    console.log(obj.constructor === RegExp) //false
    console.log(new Number(1).constructor === Number) //true
    
    1
    2
    3
    4
    • constructor 检测 Object 和 instanceof 不一样,一般情况下是检测不了的

      var reg = /^$/
      console.log(reg.constructor === RegExp) //true
      console.log(reg.constructor === Object) //false
      
      1
      2
      3
  • 3.局限性:我们可以把类的原型进行重写,在重写的过程中和可能出现把之前的 constructor 覆盖

    function fn() {}
    fn.prototype = new Array()
    var f = new fn()
    console.log(f.constructor === Array) //true
    
    1
    2
    3
    4
    • 对于特殊的数据类型 null 和 undefined,他们的所属类是 Null 和 Undefined,但是浏览器把这两个类保护起来了,不允许我们在外面访问使用

# 3.4 toString

  • 1.基本数据类型

    var ary = []
    console.log(Object.prototype.toString.call("")) //"[object String]"
    console.log(Object.prototype.toString.call(1)) //"[object Number]"
    console.log(Object.prototype.toString.call(true)) //"[object Boolean]"
    console.log(Object.prototype.toString.call(null)) //"[object Null]"
    console.log(Object.prototype.toString.call(undefined)) //"[object Undefined]"
    
    1
    2
    3
    4
    5
    6
  • 2.复杂数据类型

    var ary = []
    console.log(Object.prototype.toString.call(ary)) //"[object Array]"
    console.log(Object.prototype.toString.call([])) //"[object Array]"
    console.log(Object.prototype.toString.call(function fn() {})) //"[object Function]"
    console.log(Object.prototype.toString.call(new RegExp())) //"[object RegExp]"
    
    1
    2
    3
    4
    5
  • 返回的结果是字符串

var reg = /^\[object Array\]\$/
var ary = []
console.log(reg.test(Object.prototype.toString.call(ary))) //false
1
2
3
  • toString 的理解:乍一看应该是转换为字符串,但是某些 toString 方法不仅仅是转换为字符串,对于 Number、String、Boolean、Array、RegExp、Date、Function 原型上的 toString 方法都是把当前的数据类型转换为字符串的类型(它们的作用仅仅是用来转换为字符串的)
console.log((1).toString()) //"1" Number.prototype.toString-->转换为字符串
console.log((1).__proto__.__proto__.toString()) //["Object","Object"]  Object.prototype.toString
console.log((128).toString(2 / 8 / 10)) //把数字转换为 2/8/10 进制
1
2
3