大家都知道,在JS中将数据类型分类的话,会分为number,string,boolean,null,undefined和object。其中前五种属于基本类型,object属于复杂类型。但是这并不是我想讲的,今天我想和大家探讨一个问题:使用typeof能得到哪些类型?一拿到问题,可能很多人脑海中的第一反应是答案,但我们实际应该看到和想到的是知识点。
首先,按照变量的存储类型可以分为值类型和引用类型。举个例子:
var a = 1;
var b = a;
console.log(a, b); // 1,1
a = 2;
console.log(a, b); // 2,1
在复制时是从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新值分配的位置上,所以他们是互不影响的。
var a = {age : 20};
var b = a;
console.log(b.age); // 20
a.age = 21;
console.log(b.age); // 21
当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中,不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制操作 结束后,两个变量实际上将引用同一个对象。因此改变其中一个变量,就会影响另一个变量。
那么问题来了,引用类型存在的意义是什么呢?
这是因为值类型在复制时存的是相应的值,值占用的内存不大,引用类型在复制时如果也存值,会占用很大的内存,通常都是好几块共用一块内存空间,所以引用类型是为了让内存共用。
回到我们最开始的问题,这里typeof只能区分值类型的详细类型,例如:
typeof undefined // undefined
typeof 123 // number
typeof "abc" // undefined
typeof true // boolean
可能你会疑惑null呢,我们继续看
typeof null // object
typeof [] // object
typeof {} // object
typeof console.log // function
在引用类型中,typeof只能区分function,其他的得到的值都是object;其中null也是引用类型,仅仅是一个空指针。这两点比较特殊。
总结
① 值类型包括:undefined,number,string,boolean;
引用类型包括:null,array,object,function
② typeof 可以得到的类型有:undefined,number,string,boolean,object,function
网友评论