JavaScript中,有七种内置类型:6种原始类型和引用类型,他们分别是:javascript
6种原始类型(基本类型):java
引用类型:segmentfault
咱们能够用typeof
运算符来查看类型的值:安全
typeof(undefined) //"undefined" typeof('123') //"string" typeof(123) //"number" typeof(true) //"boolean" typeof Symbol() //"symbol" typeof({name:'oops'}) //"object" typeof([1,2,3]) //"object"
咱们注意到,null值并不在列,为何呢?这里比较特殊:oop
typeof(null) //"object" , 这是js中的一个bug
咱们应该使用正确的方法来判断null值的类型:spa
var a = null; (!a && typeof a ==='object') //true
如今让咱们来看另外一个问题:什么是undefined?
答案是:变量在未持有值时,变量的类型为undefined。
为何我会在这里会单独提出这个问题?由于不少开发人员把undefined
等同于undeclared(未声明)
,这是一个观念性的错误。已在做用域中声明的变量但未赋值的,称为undefined;相反,还未在做用域中声明的变量,称为undeclared(未声明)。
举个栗子:指针
var a; a; //undefined c; //Uncaught ReferenceError: c is not defined
是否是突然明白了这二者的差异,BUT!!,请看这个栗子:code
var a; typeof a; //"undefined" typeof b; //"undefined"
奇怪,变量b未在做用域中声明,为何不报错且typeof的值怎么仍是undefined?那是由于typeof的一种特殊的安全机制。利用这点,当咱们用if条件语句判断某个变量是否有值时,能够用这种方法。举个栗子:对象
//变量a未声明,如下方式会报错 if(a){ ... } //变量a未声明,如下方式就是安全的 if( typeof a !== "undefined"){ ... }
so ,经过typeof检查undeclared变量是个不错的方法。blog
js中有六种基本类型,他们是:Undefined
、Null
、Boolean
、Number
、String
、Symbol (new in ES 6)
,基本类型的储存方式为栈内存(Stack)储存,下图所示。
由此得出如下三点结论;
举个栗子:
var a = "oops"; b = a; b; //"oops" a = "哈哈"; a; //"哈哈" b; //"oops" ,a值的改变不会影响b的值
咱们先来一个栗子看看引用类型是如何在计算机内存储的:
var a ={}; var b; a.name = "oops"; a.age = 24; b = a; console.log( b.age ); //24 a.name = "hz"; b.age = 18; console.log( a.age ) //18
从这个例子中能够看出,引用类型的值是保存在堆内存(Heap)中的对象,栈内存保存变量的指针,堆内存中保存具体的对象。
作个小小的延伸:
var a ={name:"hz"}; var b ={name:"hz"}; console.log( a == b ); //false console.log( a === b ); //false
在这个栗子中,a,b两个对象都有一条相同的值,但这两个对象却不相等,为何呢?由于
a ,b 两个对象分别引用的是存放在堆内存中的2个不一样的对象,故变量 a和 b的值(引用地址)也是不同的。
以上。
有错误的地方但愿你们指出来,共同探讨。
参考资料:
【文章】 JavaScript 深刻了解基本类型和引用类型的值
【书籍】 你不知道的javascript(中卷) 第一章:类型