【JS】javascript判断数据类型的四种方法:Object.prototype.toString.call()、typeof、instanceof、constructor

1. js的七种数据类型

基本数据类型:Number、String、Boolean、Undefined、Null、Symbol
引用数据类型:统称为 Object 类型。细分的话,有 Object 类型、Array 类型、Date 类型、RegExp 类型、Function 类型。

基本数据类型与引用数据类型的区别:

  • 从内存角度来说,基本数据类型在内存中占据一块空间,空间里存储的就是数据。获取数据是直接获取。
    引用数据类型在内存中占据两块空间,第一块空间存储的是地址,第二块空间存储的是数据。获取数据是间接获取。
  • 从赋值角度来说,基本数据类型赋的是值,引用数据类型赋的是地址。
  • 从函数传参角度来说,基本数据类型传的是值,引用数据类型传的是地址。

Undefined 类型与Null 类型的区别
Undefined 类型只有一个值,就是特殊值 undefined。当使用 var 或 let 声明了变量但没有初始化时,就相当于给变量赋予了 undefined 值。
Null 类型同样只有一个值,就是特殊值 null。逻辑上讲,null 值表示一个空对象指针。如果未来要定义的变量是一个对象,而当时又没有对象可保存,此时就可以使用 null 来对变量进行初始化。表示这个对象目前还没有存储地址。

2. js判断数据类型

下面将对如下数据进行判断它们的类型

let bool = true; //Boolean
let num = 1; //Number
let str = 'abc'; //String
let und = undefined; //Undefined
let nul = null; //Null
let arr = [1,2,3]; //Object数组
let obj = {name:'haoxl',age:18}; //Object对象
let fun = function(){console.log('I am a function')}; // Object函数

1. 使用Object.prototype.toString.call() —推荐方法

日常使用,这个就足够了

console.log(Object.prototype.toString.call(bool));//[object Boolean]
console.log(Object.prototype.toString.call(num));//[object Number]
console.log(Object.prototype.toString.call(str));//[object String]
console.log(Object.prototype.toString.call(und));//[object Undefined]
console.log(Object.prototype.toString.call(nul));//[object Null]
console.log(Object.prototype.toString.call(arr));//[object Array]
console.log(Object.prototype.toString.call(obj));//[object Object]
console.log(Object.prototype.toString.call(fun));//[object Function]

判断原生JSON对象

var isNativeJSON = window.JSON && Object.prototype.toString.call(JSON);
console.log(isNativeJSON);// 输出结果为”[object JSON]”说明JSON是原生的,否则不是;

2. 使用typeof

typeof可以测试出number、string、boolean、undefined及function,
而对于null数组对象,typeof均检测出为object,不能进一步判断它们的类型。

console.log(typeof bool); //boolean
console.log(typeof num);//number
console.log(typeof str);//string
console.log(typeof und);//undefined
console.log(typeof nul);//object
console.log(typeof arr);//object
console.log(typeof obj);//object
console.log(typeof fun);//function

3. 使用instanceof

instanceof不能区别undefined和null,而且对于基本类型如果不是用new声明的则也测试不出来,对于是使用new声明的类型,它还可以检测出多层继承关系。

console.log(bool instanceof Boolean);// false
console.log(num instanceof Number);// false
console.log(str instanceof String);// false
console.log(und instanceof Object);// false
console.log(nul instanceof Object);// false

console.log(arr instanceof Array);// true
console.log(obj instanceof Object);// true
console.log(fun instanceof Function);// true

4. 使用constructor

undefined和null没有contructor属性, constructor不能判断undefined和null,并且使用它是不安全的,因为contructor的指向是可以改变的

console.log(bool.constructor === Boolean);// true
console.log(num.constructor === Number);// true
console.log(str.constructor === String);// true

console.log(arr.constructor === Array);// true
console.log(obj.constructor === Object);// true
console.log(fun.constructor === Function);// true
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卸载引擎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值