Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

判断变量类型的几种方法 #11

Open
ceerqingting opened this issue Jul 10, 2018 · 0 comments
Open

判断变量类型的几种方法 #11

ceerqingting opened this issue Jul 10, 2018 · 0 comments

Comments

@ceerqingting
Copy link
Owner

ceerqingting commented Jul 10, 2018

1. 先看下Javascript中有哪些数据类型

  • JS中的基本数据类型:
    1. Undefined
    2. Null
    3. Boolean
    4. Number
    5. String
    6. Symbol

  • 复杂数据类型:Object;Array,Fuction, Object这些引用类型都是复杂数据类型

2. 方法一:typeof

typeof 操作符返回一个字符串,表示未经计算的操作数的类型

typeof undefined
"undefined"
typeof null
"object"
typeof true
"boolean"
typeof 1
"number"
typeof 'a'
"string"
typeof Symbol()
"symbol"
typeof {}
"object"
typeof []
"object"
typeof function(){}
"function"

由上面可以看出,null,object,array返回的结果都是 object, 无法区分这三种,再看下第二种方法

3. 第二种:instanceof

instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的prototype属性

   var a = {};
   var b = [];
  a instanceof Object;   // true
  b instanceof Array;   // true
  b instanceof Object:  // true

可以看出,第二种方法只能区分出 Array, 无法区分 Object

4. 第三种: constructor

     function getType(v) {
       var c = v.constructor;
       switch(c) {
         case Object: 
           return 'object';
         case Array:
           return 'array';
         case Function:
           return 'function';
         case String:
           return 'string';
         case Number:
           return 'number';
       }
     }

当输入null 或者 undefined 时会抛出错误,所以需提前判断

     function getType(v) {
       if (v === null) return 'null'
       if (v === undefined) return 'undefined'
       var c = v.constructor;
       switch(c) {
         case Object: 
           return 'object';
         case Array:
           return 'array';
         case Function:
           return 'function';
         case String:
           return 'string';
         case Number:
           return 'number';
       }
     }

如果涉及到原型链的继承,并不推荐

  function A(){}
  var B = new A()
  B.constructor === Object // false

4. 第四种:Object.prototype.toString.call()

    Object.prototype.toString.call([])
    "[object Array]"
    Object.prototype.toString.call({})
    "[object Object]"
    Object.prototype.toString.call(function(){})
    "[object Function]"
    Object.prototype.toString.call('a')
    "[object String]"
    Object.prototype.toString.call(1)
    "[object Number]"
    Object.prototype.toString.call(null)
    "[object Null]"
    Object.prototype.toString.call(undefined)
    "[object Undefined]"

完美解决所有类型

5. 常见的类型判断

  • 除Null之外的四种基本类型值的判断 Number, String, Boolean, Undefined,用typof 即可

  • Null类型的判断

  1. 全等===
  2. Object.prototype.toString.call()
  • Array类型的判断
  1. instanceof
  2. Array.isArray()
  3. Object.prototype.toString.call()
  • Object类型的判断
  1. Object.prototype.toString.call()

6. 关于基本包装类

《Javascript高级程序设计 第五章第六节 基本包装类型》

为了方便操作基本类型值,ECMAscript提供了3个特殊的引用类型:Boolean, Number, String。每当读取一个基本类型值时,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据

  var s1 = "some test";
  var s2 = s1.substring(2)

在读取模式中,后台会自动完成下列处理:

  1. 创建String类型的一个实例
  2. 在实例上调用制定的方法
  3. 销毁这个实例

以上过程相当于

  var s1 = new String("some text")
  var s2 = s1.substring(2)
  s1 = null

所以你以为instanceof 读取这三种基本数据类型的时候会返回对象类型吗?too young too simple

  var str = "some test";
  str instanceof String; // false

说明 instanceof 运算符是直接访问的变量的元是值,因此instanceof 并不能用来判断五种基本类型的值

参考资料:Javascript 判断变量类型的陷阱 与 正确的处理方式

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant