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; //undefined
c; //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); //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(中卷)第一章:类型