JS-判断js数据类型的几种方式

JavaScript016

JS-判断js数据类型的几种方式,第1张

js的数据类型分为两大类:

基本类型:也称为简单类型,由于其占据空间固定,是简单的数据段,为了便于提升变量查询速度, 将其存储在栈中,即按值访问

引用类型:也称为复杂类型,由于其值的大小会改变,所以不能将其存放在栈中,否则会降低变量查询速度,因此, 其值存储在堆中 ,而存储在变量处的值,是一个指针,指向存储对象的内存处,即 按址访问 。引用类型除 Object 外,还包括 Function 、Array、RegExp、Date 等等。

引用类型和基本类型的区别:

1、基本类型按 访问

需要注意的是:

A instanceof B用来判断A是否属于B的实例,返回true或者false。

需要注意的是:

ES5中可以用Array.isArray([])来准确判断数组的实例

当创建变量b时,js会在b的原型上添加constructor属性,指向b的引用

js在创建内置对象时,也是这么做的:

Object对象有tostring方法返回:

而非object对象,则需要call/apply才能正确返回类型,返回格式为字符串类型的 "[object 数据类型xxx]" :

以上几种方式可以在不同场景使用。

typeof 是一个操作符,其右侧跟一个一元表达式,并返回这个表达式的数据类型。返回的结果用该类型的字符串(全小写字母)形式表示,包括以下 7 种:number、boolean、symbol、string、object、undefined、function 等。

有些时候,typeof 操作符会返回一些令人迷惑但技术上却正确的值:

对于基本类型,除 null 以外,均可以返回正确的结果。

对于引用类型,除 function 以外,一律返回 object 类型。

对于 null ,返回 object 类型。

对于 function 返回  function 类型。

其中,null 有属于自己的数据类型 Null , 引用类型中的 数组、日期、正则 也都有属于自己的具体类型,而 typeof 对于这些类型的处理,只返回了处于其原型链最顶端的 Object 类型,没有错,但不是我们想要的结果。

在 ES5 中,存在 6 种数据类型。

基本类型(值类型): String、Number、Boolean、undefined、null

对象类型(引用类型):Object,其中 Object 有三种特殊的对象(Function、Array、Date)

PS: undefined 和 null 的第一个字母都是小写

Q: undefined 和 null 有什么区别?

A: 当一个变量被声明,但是还没有赋值的时候,则为 undefined.

当一个变量被声明了,并且已经赋值了,赋的值为 null,则为 null

根本区别就是在于在声明的时候有没有被赋值

常用的判断数据类型的方法

划重点!!! typeof(xxx) 返回的是一个字符串

举个栗子1

举个栗子2

举个栗子3

typeof 可以判断以上 4 中基本类型(Number、String、Boolean、undefined)

判断不了 null 类型

举个栗子4

是不是很奇怪?null 作为基础类型,但是在判断类型的时候却为 object?

其实设计者是这么想的,他先定义了一个变量,这个变量是准备赋值为对象的,由于某些原因,比如对象的属性还不清楚,所以一开始就给变量赋值为 null,表明这个变量将来是个对象。

null 还有另外一个作用,在最后的时候,给变量赋值为 null,可以让变量指向的对象成为垃圾对象,从而被垃圾回收器回收。

上面的例子证明,null 类型和 对象类型通过 typeof 是无法区分的。

没错,JS 的开发者就是不想让你们这么好过,只记住一个规矩就想闯天下了吗??? Naive!!!

为了让你们多学点本领,于是就有了 instanceof

instanceof 字面意思就是实例。a instanceof b, a 是 b 的实例,b 为 构造函数 。返回值为 布尔值

实现原理是通过检测 b.prototype 是否存在于 a 的原型链上

举个栗子1

但是吧,你想用来判断 null 类型,不好意思,直接报错, null 并不是一个对象

先看完下面的例子,再来看怎么判断 null

下面看个有迷惑行为的例子

言归正传,怎么说来说去都没说怎么判断是不是 null 类型

===

直接上全等于 === 不就好了嘛,就是这么简单快捷!!!

typeof:

可以判断除了 null 之外的值类型 Number、String、Boolean、undefined

还可以判断一个引用类型 Function

不能区分: null 和 Object

instanceof:

判断对象的具体类型

===

判断 undefined 和 null

一般情况下,使用 typeof 去判断就可以了。

当确定是 Object 类型的数据,则使用 instanceof 去具体区分是属于 Function/Array/Date 的哪种类型

很多情况下,都要判断数据不能为 undefined 和 null,那就可以直接判断 xxx !== undefined &&&xxx !== null