博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js学习总结----数据类型检测的四种方式(转载)
阅读量:5282 次
发布时间:2019-06-14

本文共 2384 字,大约阅读时间需要 7 分钟。

1、typeof 用来检测数据类型的运算符 

console.log(typeof 12)//Number

  使用typeof检测数据类型,首先返回的都是字符串 ,其次字符串中包含了对应的数据类型

  例如:"number"、"string"、"boolean"、"undefined"、"function"、"object"

  console.log(typeof typeof function(){}) //string

  局限性:

    typeof null -> "object"

    不能具体的细分是数组还是正则,还是对象中其他的值,因为使用typeof检测数据类型,对于对象数据类型中的值,最后返回的结果都是"object"

2、instanceof 检测某一个实例是否属于某个类

var obj = [12,23];        console.log(obj instanceof Array);

  局限性:

  对于基本数据类型来说,字面量方式创建出来的结果和实例方式创建出来的结果是有一定的区别的。从严格意义上讲,只有实例创建出来的结果才是标准的对象数据类型值,也是标准的Number这个类的一个实例;对于字面量方式创建出来的结果是基本的数据类型值,不是严谨的实例,但是由于JS的松散特点,导致了可以使用Number.prototype上的方法

  1)、不能用来检测和处理字面量方式创建出来的基本数据类型值

console.log(1 instanceof Number);//false        console.log(new Number(1) instanceof Number)//true

  2)、instanceof的特性:只要在当前实例的原型链上,我们用其检测的结果都为true

var ary = [];        console.log(ary instanceof Array);//true        console.log(ary instanceof Object);//true        function fn(){        }        console.log(fn instanceof Function);//true        console.log(fn instanceof Object);//true  

3、constructor 构造函数  作用和instanceof非常的相似   constructor可以处理基本数据类型的检测

constructor检测Object和instanceof不一样 一般情况下是检测不了的

var obj = [];        console.log(obj.constructor === Array)//true        var num = 1;        console.log(num.constructor === Number)//true

  局限性:我们可以把类的原型进行重写,在重写的过程中很有可能出现把之前的constructor给覆盖掉了,这样检测出来的结果就不准确了。

  对于特殊的数据类型null和undefined,他们所属的类是Null和Undefined,但是浏览器把这两个类保护起来了,不允许我们在外面访问使用

4、Object.prototype.toString.call()  最准确最常用的方式  各种类型的都可以检测(基本和引用)

  首先获取Object原型上的toString方法,让方法执行,并且改变方法中的this关键字的指向

  toString的理解:

  表面上看应该是转化成字符串,但是某些toString方法不仅仅是转换为字符串

  对于Number、String、Boolean、Array、RegExp、Date、Function原型上的toString方法都是把当前的数据类型转化为字符串的类型(他们的作用仅仅是用来转换为字符串的)

  Object.prototype.toString()并不是用来转化为字符串的,他的作用是返回当前方法执行主体(方法中的this)所属类的详细信息。  

({name:"李四"}).toString() //[object object]        Math.toString()//[object Math]
({name:"李四"}).toString() //[object object]        Math.toString()//[object Math]        var obj = {name:"张三"};        console.log(obj.toString())//toString中的this是obj,返回的是obj所属的类的信息。[object Object] 第一个object代表当前实例是对象数据类型的(这个是固定的),第二个Object代表的是obj所属的类是Object

  console.log((1).toString()) // "1"  Number.prototype.toString转化为字符串

  console.log((128).toString(2/8/10))  把数字转化为2进制、8进制、10进制

  所以上面的方法的检测如下 

var ary = [];        console.log(Object.prototype.toString.call(ary))//[object Array]

转载于:https://www.cnblogs.com/fengxianzi/p/7121999.html

你可能感兴趣的文章
MetaWeblog API Test
查看>>
c# 文件笔记
查看>>
类和结构
查看>>
心得25--JDK新特性9-泛型1-加深介绍
查看>>
安装NVIDIA驱动时禁用自带nouveau驱动
查看>>
HDU-1255 覆盖的面积 (扫描线)
查看>>
Java 中 静态方法与非静态方法的区别
查看>>
Jenkins+ProGet+Windows Batch搭建全自动的内部包(NuGet)打包和推送及管理平台
查看>>
线程池的概念
查看>>
Java 序列化
查看>>
Java 时间处理实例
查看>>
Java 多线程编程
查看>>
Java 数组实例
查看>>
mysql启动过程
查看>>
2017前端面试题总结
查看>>
SWIFT国际资金清算系统
查看>>
站立会议第四天
查看>>
利用AMPScript获取Uber用户数据的访问权限
查看>>
Mysql 数据库操作
查看>>
转:linux终端常用快捷键
查看>>