# 判断数据类型的方案

# 判断变量类型的方案

# 1. typeof

  • 对于原始值类型除了null外都可以准确判断
  • 对于对象来说,除了函数都会显示 object
    • null不是对象

原始值类型

  • number
  • string
  • boolean
  • symbol
  • undefined
  • null 不能使用typeof正确判断

# 2. instanceof

  • 通过原型链进行判断
[] instanceof Array // true
{} instanceof Object // true
new String('sss') instanceof String // true
1
2
3
  • 通过instanceof判断string值类型的方法
    • Symbol.hasInstance能够让我们自定义函数的行为
class myString{
    static [Symbol.hasInstance](str){
        return typeof str === 'string'
    }
}
'ss' instanceof myString // true
1
2
3
4
5
6

# 3. String.prototype.toString

Object.prototype.toString方法返回对象的类型字符串,因此可以用来判断一个值的类型

不同对象都定义了自己的toString方法

不同数据类型的Object.prototype.toString方法返回值如下:

  • 数值:返回[object Number]。
  • 字符串:返回[object String]。
  • 布尔值:返回[object Boolean]。
  • undefined:返回[object Undefined]。
  • null:返回[object Null]。
  • 数组:返回[object Array]。
  • arguments 对象:返回[object Arguments]。
  • 函数:返回[object Function]。
  • Error 对象:返回[object Error]。
  • Date 对象:返回[object Date]。
  • RegExp 对象:返回[object RegExp]。
  • 其他对象:返回[object Object]。

所以可以通过.call方法改变this的指向以达到判断的目的

Object.prototype.toString.call(2) // "[object Number]"
Object.prototype.toString.call('') // "[object String]"
Object.prototype.toString.call(true) // "[object Boolean]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(Math) // "[object Math]"
Object.prototype.toString.call({}) // "[object Object]"
Object.prototype.toString.call([]) // "[object Array]"
1
2
3
4
5
6
7
8

# 书写一个通用的

function type (o){
  var s = Object.prototype.toString.call(o);
  return s.match(/\[object (.*?)\]/)[1].toLowerCase();
};

type({}); // "object"
type([]); // "array"
type(5); // "number"
type(null); // "null"
type(); // "undefined"
type(/abcd/); // "regex"
type(new Date()); // "date"
1
2
3
4
5
6
7
8
9
10
11
12