JavaScript是一个弱类型语言,不需要声明变量的类型,意为着一个变量可以存储任意类型的数据。代码执行的时候数据的类型由JS引擎自动确定。JS中数据分为基本类型和引用类型。基本类型有number、string、boolean、null、undefined(新标准中增加了symbol和BigInt类型)。引用类型有object、function、array,其实function和array本质上也是对象(object)。
怎样可以知道一个变量存储的数据是什么类型呢?通常使用typeof函数:
var a = 1
typeof(a) //返回number typeof a 与 typeof(a)等效
var b = 'data'
typeof(b) //返回string
var c = true
typeof(c) //返回boolean
var t = null
typeof(t) //返回object
var d = [1,'data',true]
typeof(d) //返回object
是不是从第8行开始有点疑惑?前面不是说的null是基本类型吗,为什么返回的是object呢?或者说什么时候typeof会返回object?null与undefined的意思有点类似,它们有什么区别呢?其实这是历史遗留的问题,不用太过深究。声明了一个变量但是没有赋值,那么它初始值就是undefined,如果赋值一个对象,那么就是object。 null的定义是一个未设置对象的值的值。说白了,一个变量打算是对象,但是还未想好属性值。那么就给它赋值null,代表这个变量以后存储的是对象。第10行说明如果判断基本类型,typeof够用。但是引用类型如果要判断具体类型的话,不一定。复杂类型应该使用instanceof,如:
var a = {}
var b = [1,2]
var c = function(){}
var d = 1
var e = new Number(1)
a instanceof Object //返回true
b instanceof Array //返回true
c instanceof Function //返回true
d instanceof Number //返回false
e instanceof Number //返回true
用它同样可以判断基本类型的数据,那为什么先用typeof举例子引出instanceof呢?因为instanceof在判断基本类型时,不是用new声明的类型,就返回false,null和undefined都是返回false。综上所述,判断一个变量是什么类型时通常使用typeof,然后用instanceof。基本类型用typeof,引用类型用instanceof。
JS可以把基本类型临时转换成对象,可以这样:
也就是说可以通过判断构造函数来判断数据类型了
var a = 1
a.constructor === Number //返回true
不过undefined和null不能用此方法。
通过某个对象调用toString方法也可以判断,如下:
var a = 1
var b = {}
var c = []
var d = function(){}
toString.call(a) //返回[object Number
toString.call(b) //返回[object Object]
toString.call(c) //返回[object Array]
toString.call(d) //返回[object Function]
//用apply效果自然也是一样的