嘘~ 加载慢,正在从阿水的辣鸡服务器里偷取页面 . . .

js确定数据类型的方式详解


JavaScript学习笔记

js确定数据类型

1、typeof

适用与简单数据类型

let s = "abcd"
console.log(typeof s)//string

let num = 1
console.log(typeof num)//number

let b = true
console.log(typeof b)//bollean

let n = null
console.log(typeof n)//object

let u;
console.log(typeof u)//undefined

let obj = new Object()
console.log(typeof obj);//object

let arr = new Array()
console.log(typeof arr);//object

let fun = new Function()
console.log(typeof fun);//function

由此可见,该方法除了对除null之外的简单数据类型有效外,对引用类型没有得出我们想要的结果。

解释:

  • null在js中被认为是一个特殊的对象,是一个空指针对象,所以返回object。
  • 创建Function或者Array这些类型的实例的时候,其实都是基于Object实例进行的一种扩展,所以都归为object。至于Function会返回function的原因,JavaScript权威指南中给出的解释是,函数有它特有的特性。

2、instanceof

instanceof检测的是原型,适合用来检测引用类型。(关于原型,参考阅读:面向对象编程

A instanceof B用来判断A是否是B的实例,如果A是B的实例则返回true,否则返回false。

但是也有个缺点,因为function和array都是object的实例,所以当它们对object进行检测时,也都返回true。

let fun = new Function()
console.log(fun instanceof Function)//true
console.log(fun instanceof Object)//true

let arr = new Array();
console.log(arr instanceof Array)//true
console.log(arr instanceof Object)//true

let obj = new Object();
console.log(obj instanceof Object)//true

3、constructor

constructor是原型对象的一个属性,它指向了对象原型本身。

constructor是原型对象的属性,之所以我下面的例子可以直接用实例.constructor判断是因为这里涉及到了原型链。

console.log("".constructor)//string()
console.log(new Number(1).constructor);//Number()
console.log(true.constructor);//Boolean()
console.log([].constructor);//Array()
console.log(new Function().constructor);//Function()
console.log({}.constructor);//Object()

但是这种方法判断也是有问题的:

  • null和undefined没有constructor,所以无法用这种方法判断。
  • 如果原型对象被重写,那么constructor就可能被丢失。

4、Object.prototype.toString.call()

toString()是Object的原型方法,调用该方法,默认返回当前对象的[[class]]。

console.log(Object.prototype.toString.call('abc'));// [object String]
console.log(Object.prototype.toString.call(123));// [object Number]
console.log(Object.prototype.toString.call(true));// [object Boolean]
console.log(Object.prototype.toString.call({}));//[object Object]
console.log(Object.prototype.toString.call([]));// [object Array]
console.log(Object.prototype.toString.call(new Function()));//[object Function]
console.log(Object.prototype.toString.call(null));// [object Null]
console.log(Object.prototype.toString.call(undefined));// [object Undefined]

该方法是最合适用来判断数据类型的方法。


文章作者: 百念成诗
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 百念成诗 !
评论
  目录