js数据类型及判断数据类型的几种常用方式

js数据类型

共有八种数据类型

undefined、Null、 Boolean、 String、 Number、 Symbol、 BigInt、 Object

基本数据类型: undefined Null Boolean String Number

引用数据类型: Object

Symbol和Bigint是ES6中新提出来的数据类型。

Symbol: 表示创建的数据是独一无二的不可变的,主要是用来解决全局变量冲突的问题。

BigInt: 是一种数字类型,可以用来表示任意精度的整数,可以解决大数运算的精度问题,即使运算的结果已经超出Number能够表示的范围。

基本数据类型与引用数据类型的区别主要在于存储区域的不同。

基本数据类型:存储在栈中,它的占据空间小、大小固定,属于频繁使用的数据,所以放入栈存储空间。

引用数据类型:存储在堆中,它的占据空间大、大小不固定。如果存储在栈中会影响程序运行的性能。它在栈中存储有一个指针,用于指定当前自己在堆存储空间中的位置,当解释器寻找引用值时,会首先检索其在栈中的指针,取得地址后在堆中获取引用实体。

判断数据类型的方式

使用typeof

typeof undefined   //undefined

typeof Null  //object

typeof []  //object

typeof function(){}  //function

typeof ""  //string

typeof 1 //number

typeof false  //boolean

typeof NaN  //number

使用instanceof

instanceof只能正确判断引用数据类型,而不能判断基本数据类型。

原理:判断构造函数的prototype对象是否在实例对象的原型链上。

{} instanceof Object   //true

[] instanceof Array   //true

function(){} instanceof Function  //true

let obj = new String("abc")

obj instanceof String   //true

obj = new Boolean("true")

obj instanceof Boolean   //true

obj = new Number(1)

obj instanceof Number   //Number

使用constructor

查看实例对象的构造器是否是某构造函数

let obj = []

obj.constructor === Array   //true

obj = {}

obj.constructor === Object   //true

function Person(){}

obj = new Person()

obj.constructor === Person   //true

(2).constructor === Number   //true

(true).constructor === Boolean   //true 

使用Object.prototype.toString()

Object.prototype.toString.call(2)   //"[object Number]"

Object.prototype.toString.call([])   //"[object Array]"

Object.prototype.toString.call({})   //"[object Object]"

Object.prototype.toString.call(function(){})   //"[object Function]"

为什么不直接使用Array或Function的toString()方法?

由于Array和Function是Object的实例,都重写了Object的toString()方法,Function的toString()方法返回的是函数体的字符串,数组的toString()方法返回的是包含所有元素的字符串,当调用方法时由于原型链的查找规则,会就近调用同名方法,所以当他们的实例对象直接调用toString()方法时,调用的是自身重写的toString()方法,此时的返回值无法准确的判断对象的类型,所以需要使用顶层对象Object的toString()方法才能获取对象的类型字符串。

判断是数组的其他方法

Array.isArray()

Array.isArray([])   ///true

Array.prototypr.isPrototypeOf()

判断Array的原型对象prototype是否是目标对象的对象原型__proto__所指向的原型对象。

每个实例对象都有一个__proto__属性在js中叫做对象原型,每个构造函数有一个prototype属性在js中叫做该构造函数的原型对象,一般情况下对象原型都指向实例对象的构造函数的原型对象。

Array.prototype.isPrototypeOf([])   //true

判断数据是非数值的方法

isNaN()

isNaN(2)  //false

isNaN("a")  //true

isNaN("2")  //false

Number.isNaN()

Number.isNaN(1)   //false

Number.isNaN("1")  //true

Number.isNaN("a")  //true

isNaN()与Number.isNaN()的区别:

isNaN():会先将非数字数据强制转换为Number数据类型,如果不能转换为Number类型或转换类型为NaN则返回true,否则为false

Number.isNaN():ES6中新引入的一个方法。用于判断数据是否严格等于NaN。与isNaN的区别在于它不会将数据强制转换为Nunber类型,只有在参数严格等于NaN时才返回true否则返回false。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值