1. JS数据类型
JS总共有7种数据类型,分别是string、number、boolean、null、undefined、symbol、object,前六种为基础类型,object为引用类型。
一个JS变量可以切换任意类型,变量没有类型,只有值才有类型。
var a = 1;
a = 'string';
2. 基础类型和引用类型
说到基础类型和引用类型,这里就需要引入栈和堆的概念:
-
栈(stack)一般用来存储基础类型string、number、boolean、null、undefined、symbol,一个变量对应一个栈内存空间,特点是存储值大小固定,空间小,执行效率高;
-
堆(heap)一般用来存储引用类型object,JS中,数组、对象和函数都是object(函数是一种特殊的对象),创建一个对象后,系统会分配给对象一个堆内存空间,同时在栈内存中存储这个对象的地址,指向该对象。堆内存的特点是空间大,可以动态调整,执行效率低。
因此,每新建一个基础类型变量,都开辟了一个栈内存空间,基础类型的值都是通过值复制的方式来进行赋值和传递的:
var num1 = 1;
var num2 = num1;
num1 = 2;
console.log(num1);// 2
console.log(num2);// 1
而引用类型的值传递,是通过将变量保存在栈内存中的引用地址,赋值给新的变量来传递的:
var a = { a: 1, b: 2 };
var b = a;
a.a = 3;
console.log(b);// { a: 3, b: 2 }
a = null;
console.log(b);// { a: 3, b: 2 }
这个示例中a指向一个对象,b通过a的赋值,也指向这个对象,此时修改a.a的值,意味着这个对象发生了变化,因为b.a也被修改为3,当把null赋值给a,a就不再指向这个对象,而b没有任何变化,因此b的值依然是这个对象。