检测数据类型的几种方法

ECMAscript 中规定的数据类型有:

1.简单类型:String、Number、Boolean、Undefined、Null、Symbol

2.引用(复杂)类型:Object

 

检测这些数据的类型的方法有:

第一种:typeof 可以检测一些基本的数据类型
语法:typeof 后面加不加括号都是可以用的
注意:正则、{}、[]、null输出结果为object
所以这个方法并不是很好

例子:

console.log(typeof /\d/);//object
console.log(typeof {});//object
console.log(typeof []);//object
console.log(typeof (null));//object
console.log(typeof 123);//number
console.log(typeof true);//boolean
console.log(typeof function () {});//function
console.log(typeof (undefined));//undefined

第七种:valueOf

可以看到数据最本质内容(原始值)
例子:
1     let x = "12345";
2     let s = new String('12345');
3     console.log(typeof x);//string
4     console.log(typeof s);//object
5     console.log(x == s);//true  (typeof检测出来是对象居然和一个数组相等,显然s并不是一个真的对象。)
6     //此时看看 valueOf()的表现
7     console.log(s.valueOf());//12345  拿到s的原始值是 字符串的12345
8     console.log(typeof s.valueOf())//string  这才是 s 的真正的数据类型

 

第二种:instanceof 检测当前实例是否隶属于某各类。
双目运算符 a instanceof b ,判断a的构造器是否为b,返回值为布尔值

例子:

1 function fn() {}
2 let f = new fn;
3 console.log(f instanceof fn);//true
4 console.log(f instanceof Object);//true
5 let arr = [1,2,3,4];
6 console.log(arr instanceof Array);//true

 

第三种:constructor 构造函数
语法:实例.constructor

对象的原型链下(===构造函数的原型下)有一个属性,叫constructor 

缺点:constructor并不可靠,容易被修改(只有参考价值)。即使被修改了,也不会影响代码的正常运行。

正常开发的时候,constructor不小心被修改了,为了方便维护,和开发,可以手动更正constructor的指向。

例子:

1 function fn() {}
2 let f = new fn;
3 console.log(f.constructor.name);//fn
4 console.log(fn.constructor);//Function(){}
5 console.log(Function.constructor);//Function(){}

 

第四种:hasOwnporperty 检测当前属性是否为对象的私有属性
语法: obj.hasOwnporperty("属性名(K值)")

例子:

let obj = {
name:"xx"
};
console.log(obj.hasOwnProperty('name'));//true
console.log(obj.hasOwnProperty('xxxx'));//false

 

第五种:is Array 判断是否为数组
例子:

console.log(Array.isArray([]));//true
console.log(Array.isArray(new Array()));//true

 

第六种:Object.portotype.toString最好的
语法:Object.prototype.toString.call([value])
获取Object.portotype上的toString方法,让方法的this变为需要检测的数据类型值,并且让这个方法执行


在Number、String、Boolean、Array、Function、RegExp...这些类的原型上都有一个toString方法:这个方法就是把本身的值转化为字符串

(12).toString()//'12'
(true).toString()//'true'
[12,23].toString()//'12.23'

...

在Object这个类的原型上也有一个方法toString,但是这个方法并不是把值转换成字符串,而是`返回当前值得所属类详细信息,固定结构:'[object 所属的类]'`

 

1 var obj ={name:'珠峰'}
2 obj.toString()//[object Object]

 

调取的正是Object.prototype.toString方法


obj.toString()
 首先执行Object.prototype.tostring方法
 这个方法中的this就是我们操作的数据值obj
 =>总结:Object.prototype.toString执行的时候返回当前方法中的this的所属类信息

 也就是,我想知道谁的所属类信息,我们就把这个toString方法执行,并且让this变为我们检测的这个数据值,那么方法返回的结果就是当前检测这个值得所属类信息
 Object.prototype.toString()
 ({}).toString.call([value])

Object.prototype.toString.call(12)//[boject Number]

Object.prototype.toString.call(true)//[boject Boolean]

......

"[object Number]"
"[object String]"
"[object Object]"
"[object Function]"
"[object Undefined]"
"[object Null]"
"[object RegExp]"
"[object Boolean]"

使用toString检测数据类型,不管你是啥值,我们都可以正常检测出需要的结果(这个方法检测是`万能`的)

话外:
1.Math是个对象,不是类。类才有prototype(原型)。`也就是说类都有原型:prototype,对象都有原型链:__proto__,函数既是类,也是对象,也是函数。`
2.如何把对象转换成字符串?

 对象下的toString方法是检测数据类型的,而不是用来转化成字符串的,这时可以用JSON的方法来转化

1 let obj={name:'朱军林'}
2 obj.toString()//=>"[object Object]"
3 
4 
5 JSON.stringify({name:'朱军林'})
6 "{"name":"朱军林"}"

 



转载于:https://www.cnblogs.com/MrZhujl/p/9837152.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值