Javascript高级技巧系列--类型检测

381 阅读3分钟

数据类型

js中的数据类型,主要分为两种:

  • 基本数据类型(字符串String、数字Number、布尔Boolean、空Null、未定义UndefinedSymbol
  • 引用数据类型(对象Object

Symbol:见文末

检测方法

对于以上数据类型,常用的检测方法如下:

typeofinstanceOfObject.prototype.toString

typeof

用法:typeof(value)或者 typeof value

typeof 是一个操作符而不是函数,所以语法中的括号可用可不用

返回值有5中情况:

  • "number":数字
  • "string":字符串
  • "undefined":未定义 undefined
  • "function":函数
  • "object":对象、数组或者null
typeof NaN  //"number"
typeof 100 // "number"
typeof "str" // "string"
typeof undefined // "undefined"
typeof function a(){}  // "function"
typeof {} // "object"
typeof [] // "object"
typeof null  // "object"
typeof /^\d$/  // "object"
typeof window  // "object"
typeof new Date(2019, 0, 31)  // "object"

注意

  • typeof 操作符的操作数可以是变量(value),也可以是数值字面量
  • 调用 typeof null 会返回"object",因为特殊值 null 被认为是一个空的对象引用
  • Safari 5 及之前版本、Chrome 7 及之 前版本在对正则表达式调用 typeof 操作符时会返回"function",而其他浏览器在这种情况下会返回 "object"

instanceof

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

用法:obj instanceof Object

var a=new Array()
a instanceof Array // true
a instanceof Object // true; Object是所有数据类型的父类
//****************
function TestFun1(){}
function TestFun2(){}
var fun1 = new TestFun1()
fun1 instanceof TestFun1 // true
fun1 instanceof TestFun2 // false

在多层继承关系中,instanceof 运算符同样适用

TestFun1 instanceof Function // true
TestFun1 instanceof Object  // true

注意:prototype属性,是可以被手动更改的

TestFun1.prototype = {}
fun1 instanceof TestFun1 // false

Object.prototype.toString.call(value)

上述两种方式,都有自己的不足之处,而该方法可以很好的弥补。

我们都知道在任何值上调用 Object 原生的 toString()方法,都会返回一个[object NativeConstructorName]格式的字符串。每个类在内部都有一个[[Class]]属 性,这个属性中就指定了上述字符串中的构造函数名。

用法:Object.prototype.toString.call(value)

返回值:

Object.prototype.toString.call(1)    //   "[object Number]"
Object.prototype.toString.call(NaN)  //   "[object Number]"
Object.prototype.toString.call([])   //   "[object Array]"
Object.prototype.toString.call({})   //   "[object Object]"
Object.prototype.toString.call('str') //  "[object String]"
Object.prototype.toString.call(null) //   "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]
Object.prototype.toString.call(/\d/) // "[object RegExp]"

但是,ObjecttoString()方法不能检测非原生构造函 数的构造函数名,所以开发人员定义的任何构造函数都将返回[object Object]。有些 JavaScript 库会包 含与下面类似的代码。

var Person function(){
    this.name= 'zhangsan'
    this.age = 24
}
var p1 = new Person()
Object.prototype.toString.call(p1) // "[object Object]"

Symbol

symbol 是一种基本数据类型 (primitive data type)。Symbol()函数会返回symbol类型的值,该类型具有静态属性静态方法。它的静态属性会暴露几个内建的成员对象;它的静态方法会暴露全局的symbol注册,且类似于内建对象类,但作为构造函数来说它并不完整,因为它不支持语法:"new Symbol()"

Symbol类型的值,最大特点就是每个从Symbol()返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符

var sym2 = Symbol('foo');
var sym3 = Symbol('foo');
sym2 === sym3 // false
Symbol.length // 0

所有 Symbols 继承自 Symbol.prototype

具体方法参考:developer.mozilla.org/zh-CN/docs/…

es6.ruanyifeng.com/#docs/symbo…