fwon / blog

writing thinking
286 stars 27 forks source link

JavaScript怎么进行类型判断? #28

Open fwon opened 7 years ago

fwon commented 7 years ago

JavaScript有7种内置类型:

roadmap.path

typeof typeof 运算符用来查看 内置类型,它返回的是类型的字符串值,但是这七中类型和它们的字符串值并不一一对应。

其中 typeof null == "object" 而不是 "null", 这可以简单理解为JavaScript的一个陈年bug。另外还有一个"function"类型,但是实际上function不是一种内置类型,它只是object的一个子类型。可能为了方便而引入的一个feature。实际使用中typeof的功能还是很鸡肋的。

roadmap.path

instanceof instanceof 用来判断 变量引用类型,引用类型通常是通过new一个构造函数生成的,如new String(),new Array()...

roadmap.path

如果你用typeof判断由上面引用类型new出来的变量,将统一得到"object"。因为这些引用类型的基本类型都是继承自Object。

var arr = new Array();
arr instanceof Array; //true
arr instanceof Object; //true
typeof arr; //"object"
"abc" instanceof String; //false

所以instanceof是用来判断某个变量是否为构造函数的实例。通常我们需要自己封装一个方法来判断我们最终的值是什么类型的,并在业务中做进一步操作。下面是一种封装的方法。

Object.prototype.toString Object 引用对象内置了toString方法,不管对于基本类型值还是构造函数生成的引用类型值,都能正确地返回其类型,我们可以这么来封装一个对象判断方法。

function isType(type) {
  return function(obj) {
    return Object.prototype.toString.call(obj) == "[object " + type + "]"
  }
}

var isObject = isType("Object")
var isString = isType("String")
var isArray = Array.isArray || isType("Array")
var isFunction = isType("Function")
var isUndefined = isType("Undefined")