关于javascript:javascript判断数据类型的方式以及优缺点

35次阅读

共计 2646 个字符,预计需要花费 7 分钟才能阅读完成。

为感激大家的反对,特发福利红包(支 F 宝口令红包),点击返回支付:Gitee

根本类型

String、Number、Boolean

援用类型

Null、Undefined、Object

typeof

最容易想到的是 typeof, 返回一个示意数据类型的字符串,返回后果包含:number boolean string object undefined function 等,typeof 能够对根本类型做出精确的判断,在对于援用类型的返回,基本上都是 object。

// 根本类型
var a = 1
var b = "1"
var c = false
var d = undefined

console.log(typeof a) // number
console.log(typeof b) // string
console.log(typeof c) // boolean
console.log(typeof d) // undefined

// 检测办法
var e = function(){}

console.log(typeof e) // function

// 检测 null、数组、日期、正则、对象,后果全为 object 
var f = []
var g = null
var h = new Date()
var i = new RegExp()
var j = {}

console.log(typeof f) // object
console.log(typeof g) // object
console.log(typeof h) // object
console.log(typeof i) // object
console.log(typeof j) // object

instanceof

用来判断 A 是否为 B 的实例,表达式为:A instanceof B,如果 A 是 B 的实例,则返回 true,否则返回 false;注:instanceof 检测的是原型

var arr = []
console.log(arr instanceof Array) // true
console.log(arr instanceof Object) // true

用 instanceof 检测数组是不是对象,返回的 true,why?instanceof 的机制是,只有以后类呈现在实例的原型对象上,后果都是 true,因为 arr.__proto__为 Array.prototype,而后 Array.prototype.__proto__为 Object.prototype,也就是 arr.__proto__.__proto__为 Object.prototype,所以后果为 true。也就是说,咱们能够更改原型链的指向,导致检测数据类型不精确。

  • 注:无奈检测根本数据类型
var a = 1
var b = "1"
var c = false
console.log(a instanceof Number) // false
console.log(b instanceof String) // false
console.log(c instanceof Boolean) // false

constructor

能够检测全副类型(undefined 和 null 除外)

  • 相比于 instanceof 的长处,能够检测根本数据类型
var a = 1
var b = "1"
var c = false

console.log(a.constructor === Number) // true
console.log(b.constructor === String) // true
console.log(c.constructor === Boolean) // true
  • 且不会顺着原型链找
var arr = []
console.log(arr.constructor === Array) // true
console.log(arr.constructor === Object) // false
  • 毛病是能够随便更改 constructor
var arr = []
Array.prototype.constructor = "q"
console.log(arr.constructor === Array) // false

Object.prototype.toString.call

最规范的检测数据类型办法,toString 是 Object 原型对象上的一个办法,并不是转为字符串,该办法默认返回其调用者的具体类型,更严格的讲,是 toString 运行时 this 指向的对象类型,返回的类型格局为 [object,x],x 是具体的数据类型,其中包含:String,Number,Boolean,Undefined,Null,Function,Date,Array,RegExp,Error,HTMLDocument,… 基本上所有对象的类型都能够通过这个办法获取

var a = 1
var b = "1"
var c = false
var d = undefined
var e = function(){}
var f = []
var g = null
var h = new Date()
var i = new RegExp()
var j = {}

console.log(Object.prototype.toString.call(a)) // [object Number]
console.log(Object.prototype.toString.call(b)) // [object String]
console.log(Object.prototype.toString.call(c)) // [object Boolean]
console.log(Object.prototype.toString.call(d)) // [object Undefined]
console.log(Object.prototype.toString.call(e)) // [object Function]
console.log(Object.prototype.toString.call(f)) // [object Array]
console.log(Object.prototype.toString.call(g)) // [object Null]
console.log(Object.prototype.toString.call(h)) // [object Date]
console.log(Object.prototype.toString.call(i)) // [object RegExp]
console.log(Object.prototype.toString.call(j)) // [object Object]
  • IE6 下,undefined 和 null 均为 Object

正文完
 0