JS7种基本数据类型

  • 六种基本数据类型:String, Number, Boolean, Null, undefined, symbol
  • 一种引用类型:Object

1.使用js判断数据类型方法

常见的判断方法有

  1. typeof
  2. instanceof
  3. Object.prototype.toString
  4. constructor
  5. duck type

1.1 typeof运算符(常见)

typeof是一种较常见的判断方法,返回的是一个字符串,比较特殊之处在判断Null类型数据,返回'object'

let a = 'abc'
let b = 123
let c = true
let d = null
let e = undefined
let f = Symbol('abc')
console.log('类型a:', typeof a)
console.log('类型b:', typeof b)
console.log('类型c:', typeof c)
console.log('类型d:', typeof d)
console.log('类型e:', typeof e)
console.log('类型f:', typeof f)

image.png
复杂类型Object,可以判断function,其他array、object等会判断为object
image.png
如果要判断数组类型,就可以用下面的instanceof

1.2 instanceof(只适用对象类型判断)

用法:

object instanceof constructor

object表示需要判断的对象,constructor表示某个构造函数,instanceof运算符用来检测constructor.prototype是否存在于参数object的原型链上。

let a = []
let b = function () {}
let c = new String()
let d = new Number()
console.log(a instanceof Array)
console.log(b instanceof Function)
console.log(c instanceof String)
console.log(c instanceof Object)
console.log(d instanceof Number)
console.log(d instanceof Object)

image.png

  • 需要注意的是,String、Number、Date等对象也是属object,所以同理,若手写了一个Car类,那么判断结果就是即属于Car类,又属于object
function Car(brand, money) {
  this.brand = brand
  this.money = money
}
var mycar = new Car("特斯拉", "30w")
console.log(mycar instanceof Car)
console.log(mycar instanceof Object)

image.png

1.3 Object.prototype.toString(较推荐使用)

这里将call()替换成apply()也是一样的效果,

let a = []
let b = function () {}
let c = new String()
let d = new Number()
let e = null
let f = {}
console.log('类型a:', Object.prototype.toString.call(a))
console.log('类型b:', Object.prototype.toString.call(b))
console.log('类型c:', Object.prototype.toString.call(c))
console.log('类型d:', Object.prototype.toString.call(d))
console.log('类型e:', Object.prototype.toString.call(e))
console.log('类型f:', Object.prototype.toString.call(f))

image.png

1.4 constructor

let a = []
let b = function () {}
let c = new String()
let d = new Number()
let e = {}
let f = null
console.log(a.constructor === Array)
console.log(b.constructor === Function)
console.log(c.constructor === String)
console.log(c.constructor === Object)
console.log(d.constructor === Number)
console.log(d.constructor === Object)
console.log(e.constructor === Object)
console.log(f.constructor) // 报错

image.png
null是无效对象,当然不存在constructor,这节内容强烈推荐阮大大的文章prototype 对象

1.5 duck type

与其说duck type(鸭子类型)是种判断方法,不如是种编程思想,比如不知道一个对象是不是数组,可以判断它的length是不是数字,它是不是有join,push这样的一些数组的方法的等等,通过一些特征判断对象是否属于某些类型
最近阅读了《JavaScript设计模式与开发实践》,对鸭子类型有了些新思考,可以看看原文内容:
image.png
在动态类型语言的面向对象设计中,鸭子类型的概念至关重要。利用鸭子类型的思想,我们不必借助超类型的帮助,就能轻松地在动态类型语言中实现一个原则:“面向接口编程,而不是面向实现编程”。例如,一个对象若有 push 和 pop 方法,并且这些方法提供了正确的实现,它就可以被当作栈来使用。一个对象如果有length 属性,也可以依照下标来存取属性(最好还要拥 有 slice 和 splice 等方法),这个对象就可以被当作数组来使用。


超人
30 声望2 粉丝

一杯茶,一包烟,一个bug改一天