面试的时候经常会问到JS 中 判断数据类型的方法,一般常用的 就是typeof了 ,其他的也想不起来,今天特意在网上查了一下,转了一个过来。


一、js中的数据类型有哪些?
JavaScript是一门弱类型语言,它的变量是无类型的,变量可以被赋予任何类型的值。在js中,数据类型有六种,其中有五种基本数据类型和一种对象类型(复杂数据类型)。基本数据类型把数据名和值直接存储在栈当中,而复杂数据类型在栈中存储数据名和一个堆的地址,在堆中存储对象的属性及值。访问时先从栈获取地址(即栈中存放的是对象的引用),再到堆中拿出相应的值。

基本数据类型:
1.number:任意的数字。
2.string:任意的字符串。
3.boolean:只有两个值,true和false。
4.null:只有一个值,null。
5.undefined:只有一个值,undefined。
这五种基本数据类型相信大家都明白,就不做展开了。

对象类型(object):
常见的有function(我把它理解为一种可以执行的对象),array等。

二、判断数据类型的方法

1.typeof

判断数据类型最常用的方法就说typeof了,它可以用来判断大多数的数据类型,下面是具体的例子:

javascript复杂数据类型 js判断复杂数据类型_js基础

 

 

大家会发现,虽然typeof能判断大多数数据的类型,但是无法区分null与object,也无法区分object和array,所以要区分它们,我们要另辟蹊径。其实,规范尝试过修改typeof null,让其返回“null”,但是修改完后大量网站无法访问,为了兼容,还是让它返回”object”。

2.instanceof

instanceof是基于原型链的一种判断对象类型的方式,它可以判断一个对象具体的类型。instanceof的左操作数为对象,如果不是就返回false,右操作数必须是函数对象或者构造函数,不是就会抛出typeError异常。下面是具体的例子:

javascript复杂数据类型 js判断复杂数据类型_js基础_02

 

 3.Object.prototype.toString

Object.prototype.toString也是一种基于原型链的判断数据类型的方法,因为js中每一个对象(空对象除外)都会继承自Object,下面是例子:

javascript复杂数据类型 js判断复杂数据类型_javascript复杂数据类型_03

 

 那么我们就可以用这种方法来区分array与object,null与object。

4.全等(===)
说这个之前,先说一说JavaScript中,“==”和“===”的区别:
1.“==”叫做相等运算符,在比较的时候可以先转换数据类型,然后进行值的比较,比如:’1’==1,将返回true。
2.“===”叫做全等运算符,它的运算规则如下:
(1)“===”两侧,只要类型不匹配就返回flase,上述例子中左侧为string类型,右侧为number,所以直接返回false。
(2)对基本数据类型,如果两侧的数据类型相同,就进行值的比较,值相同就返回true,否则返回false。
(3)对复合数据类型,并不是比较它们的值是否相等,而是比较它们的引用是否相等,即它们在栈中的地址是否相同,如果引用相等,则返回true,否则返回false。

已经扯了这么多,那么进入全等判断数据类型的正题,下面是例子:

javascript复杂数据类型 js判断复杂数据类型_js基础_04

 

 

三、null与undefined

这里就说一说null与undefined的区别吧:null表示定义了一个变量并给它赋了值,值就是null,打印该变量,值为null。而undefined表示定义了一个变量,但是并没有给这个变量赋值,如果打印该变量,输出的结果为undefined,这样子是不是就很容易理解了

 

javascript复杂数据类型 js判断复杂数据类型_javascript复杂数据类型_05

 

 

那么我们在什么时候给变量赋值为null呢?主要有以下两种情况:
1.初始赋值,表明该变量是一个对象,比如我想声明一个对象,但是并不知道接下来有哪些操作,我们就可以把它先赋值为null,即变量的数据类型为object。
2.在一个对象不再被使用时,将其变为垃圾对象,使其被垃圾回收器回收。

重点:
1.JavaScript中有哪些数据类型,如何判断这些数据类型。
2.如何判断一个变量的值是否为null。
3.“===”与“==”的区别。
4.null与undefined的区别。