怎么判断数据类型?

1、数据类型有哪些?

在学习怎么判断数据类型之前,我们先来认识一下数据类型都有哪些?

javaScript的八种数据类型 :分别是 Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt。 这里将复杂数据类型 :Object 、Array、Function归为一类为Object。

其中Symbol和BigInt是ES6中新增的数据类型:

Symbol代表创建后独一无二且不可变的数据类型,它主要是为了解决可出现的全局变量冲突的问题。

Biglnt是一种数字类型的数据,它可以表示任意精度格式的整数,使用Biglnt可以安全地存储和操作大整数,即使这个数已经超出了Number能够表示的安全整数范围。

这些数据可以分为基本数据类型和引用数据类型,

基本数据类型:Undefined、Null、Boolean、Number、String

引用数据类型:对象,数组,函数

这两种类型的区别在于存储位置的不同:

原始数据类型直接存储在栈中的简单数据段,占据空间小,大小固定

引用数据类型存储在堆中的对象,占据空间大,大小不固定。引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。

2、判断数据类型的方法?

总的来说,一共有四种方法,分别是typeof、 instanceof 、constructor、Object.prototype.toString.call()。下面就来详细展开说说:

1)、typeof

console.log(typeof 2);                //number
console.log(typeof true);             //boolean
console.log(typeof 'str');            //string
console.log(typeof []);               //object
console.log(typeof function(){});     //function
console.log(typeof {});               //object
console.log(typeof undefined);        //undefined
console.log(typeof null);             //object

2)、instanceof

instanceof可以正确的判断对象的类型,其内部运行机制是判断在其原型链中能否找到该类型的原型。

console.log(2 instanceof Number);                //false
console.log(true instanceof Boolean);            //false
console.log('str' instanceof String);            //false
console.log([] instanceof Array);                //true
console.log(function(){} instanceof Function);   //true
console.log({} instanceof Object);               //true

instanceof只能正确判断引用数据类型,而不能判断基本数据类型。instanceof运算符可以用来测试一个对象在其原型链上是否存在一个构造函数的prototype属性。

3)、constructor

console.log((2).constructor === Number);               //true
console.log((true).constructor === Boolean);           //true
console.log(('str').constructor === String);           //true
console.log(([]).constructor === Array);               //true
console.log((function(){}).constructor === Function);  //true
console.log(({}).constructor === Object);              //true

constructor有两个作用:

1、判断数据的类型

2、对象实例通过constructor对象访问他的构造函数。需要注意,如果创建一个对象来改变它的原型,constructor就不能用来判断数据类型了。

举个例子

function Fn(){};
Fn.prototype = new Array();
const f = new Fn();
console.log(f.constructor === Fn);    //false
console.log(f.constructor === Array); //true

4)、Object.prototype.toString.call()

const val = Object.prototype.toString;
console.log(val.call(2));                  //[object Number]
console.log(val.call(true));               //[object Boolean]
console.log(val.call('str'));              //[object String]
console.log(val.call([]));                 //[object Array]
console.log(val.call(function(){}));       //[object Function]
console.log(val.call({}));                 //[object Object]
console.log(val.call(undefined));          //[object Undefined]
console.log(val.call(null));               //[object Null]

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值