JavaScript - 类型比较及判空

  • typeof 适合用来检测一个对象是否已经定义或者是否已经赋值

    typeof 对于基本数据类型可以正确判断其类型, 对于引用数据类型, 只会返回’object’, 而不是其正确类型, null 会返回’object’, 因为null本质是指向空对象的指针, undefined 会返回’undefined'

  • instanceof instanceof 操作符应该仅仅用来比较来自同一个 JavaScript 上下文的自定义对象 instanceof 左操作数是一个类,右操作数是标识对象的类.如果左侧的对象是右侧类的实例,则返回true.而js中对象的类是通过初始化它们的构造函数来定义的。即instanceof的右操作数应当是一个函数。所有的对象都是object的实例。如果左操作数不是对象,则返回false,如果右操作数不是函数,则抛出typeError。 注: instanceof 用来比较属于不同 JavaScript上下文的对象(比如,浏览器中不同的文档结构)时将会出错, 因为它们的构造函数不会是同一个对象。

  • == 相等运算符 相等运算符在比较相同类型的值时, 结果和严格运算符结果完全一致 在比较不同类型的值时, 会先转换为同一类型, 在进行比较 转换规则:

    1. 原始类型值 原始类型的值会转换成数值类型在进行比较. 字符串和布尔值都会转换成数值
    2. 对象和原始值比较 对象转换成原始类型的值在进行比较
    3. null 与 undefined 与其他值比较时都返回false 他们之间进行比较时会返回true
    4. 相等运算符隐藏的类型转换, 会带来一些违反直觉的结果 IMAGE
  • === 严格运算符

    1. 如果类型不一样 直接返回false
    2. 同一类型的原始类型值(字符, 数值, 布尔值), 值相等则返回true, 值不相等则返回false
    3. 同一类型的复合类型值(数组, 对象, 函数), 不是比较他们的值是否相等, 而是比较他们是否指向同一个对象
    4. null 和 undefined 严格相等
      1
      2
      3
      
      null === null true
      undefined === undefined true
      undefined === null false
      
  • 终极类型比较 (Object.prototype.toString.call(obj).slice(8, -1))

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    > Object.prototype.toString.call('s').slice(8, -1)
    'String'
    > Object.prototype.toString.call([]).slice(8, -1)
    'Array'
    > Object.prototype.toString.call(function(){}).slice(8, -1)
    'Function'
    > Object.prototype.toString.call(false).slice(8, -1)
    'Boolean'
    > Object.prototype.toString.call({}).slice(8, -1)
    'Object'
    > Object.prototype.toString.call(null).slice(8, -1)
    'Null'
    > Object.prototype.toString.call(undefined).slice(8, -1)
    'Undefined'
    > Object.prototype.toString.call(3.4).slice(8, -1)
    'Number'
    > Object.prototype.toString.call(new Symbol()).slice(8, -1)
    'Symbol'
    
    1
    2
    3
    
      function getType(obj) {
        return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
      } 
    
  • 判断对象不存在

    1. !obj 除了对象是否存在,还要判断对象是否有null值
    2. typeof myObj == “undefined” 只判断对象是否存在
    3. 在Javascript语言中,null和undefined容易产生混淆。在可能同时涉及两者的情况下,建议使用"精确比较"运算符(===)
Licensed under CC BY-NC-SA 4.0