JavaScript中,有七种内置类型:6种原始类型和引用类型,他们分别是:6种原始类型(基本类型):空值(null)未定义(undefined)布尔值(boolean)数字(number)字符串(string)符号(symbol,ES6中新增)引用类型:对象(object)类型判断我们可以用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值并不在列,为什么呢?这里比较特殊:typeof(null) //“object” , 这是js中的一个bug我们应该使用正确的方法来判断null值的类型:var a = null;(!a && typeof a ===‘object’) //true现在让我们来看另一个问题:什么是undefined?答案是:变量在未持有值时,变量的类型为undefined。为什么我会在这里会单独提出这个问题?因为很多开发人员把undefined等同于undecleared(未声明),这是一个观念性的错误。已在作用域中声明的变量但未赋值的,称为undefined;相反,还未在作用域中声明的变量,称为undecleared(未声明)。举个栗子:var a;a; //undefinedc; //Uncaught ReferenceError: c is not defined是不是忽然明白了这两者的差别,BUT!!,请看这个栗子:var a;typeof a; //“undefined"typeof b; //“undefined” 奇怪,变量b未在作用域中声明,为什么不报错且typeof的值怎么还是undefined?那是因为typeof的一种特殊的安全机制。利用这点,当我们用if条件语句判断某个变量是否有值时,可以用这种方法。举个栗子://变量a未声明,以下方式会报错if(a){ …}//变量a未声明,以下方式就是安全的if( typeof a !== “undefined”){ …}so ,通过typeof检查undecleared变量是个不错的方法。基本类型(原始类型)js中有六种基本类型,他们是:Undefined、Null、Boolean、Number、String、Symbol (new in ES 6),基本类型的储存方式为栈内存(Stack)储存,下图所示。由此得出以下三点结论;基本类型的值是不可变的基本类型的比较是它们的值的比较基本类型的变量是存放在栈内存(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 ); //24a.name = “hz”;b.age = 18;console.log( a.age ) //18从这个例子中可以看出,引用类型的值是保存在堆内存(Heap)中的对象,栈内存保存变量的指针,堆内存中保存具体的对象。做个小小的延伸:var a ={name:“hz”};var b ={name:“hz”};console.log( a == b ); //falseconsole.log( a === b ); //false在这个栗子中,a,b两个对象都有一条相同的值,但这两个对象却不相等,为什么呢?因为a ,b 两个对象分别引用的是存放在堆内存中的2个不同的对象,故变量 a和 b的值(引用地址)也是不一样的。以上。有错误的地方希望大家指出来,共同探讨。参考资料:【文章】 JavaScript 深入了解基本类型和引用类型的值【书籍】 你不知道的javascript(中卷) 第一章:类型