动态类型

JavaScript 是一种弱类型或者说动态语言。这意味着你不用提前声明变量的类型,在程序运行过程中,类型会被自动确定。这也意味着你可以使用同一个变量保存不同类型的数据:

var foo = 42;    	// foo is a Number now
foo = "bar"; 		// foo is a String now
foo = true;  		// foo is a Boolean now

数据类型

最新的 ECMAScript 标准定义了 8 种数据类型:

7种基本数据类型:BooleanNullUndefinedNumberBigIntStringSymbol

1种引用数据类型:Object

基本数据类型

基本数据类型是指存放在栈中的简单数据段,数据大小确定,内存空间大小可以分配,它们是直接按值存放的,所以可以直接按值访问

var a = 10
var b = a;
b = 20
console.log(a) 		// 10值
console.log(b); 	// 20值

赋值过程:

javascript des Javascript的数据结构有哪些?_数据

引用数据类型

引用数据类型是存放在堆内存中的对象。变量其实是保存的在栈内存中的一个指针(保存的是堆内存中的引用地址,这个指针指向堆内存中的引用地址。通过这个引用地址可以快速查找到保存中堆内存中的对象。

注意:与其他语言的不同是,JavaScript没有按引用传递,而是传递引用类型的参数(是按值传递),不可以直接访问堆内存空间中的位置和操作堆内存空间,只能操作对象在栈内存中的引用地址。

var obj1 = new Object();
var obj2 = obj1;
obj2.name = "测试名称";
console.log(obj1.name); 	// 测试名称
console.log(obj2.name); 	// 测试名称

赋值过程:

javascript des Javascript的数据结构有哪些?_赋值_02

综合案例:

var a = [1,2,3,4]
var b = a	      //引用类型传址,对象中传给变量的数据是引用类型的,会存储在堆中
var c = a[0]	      //基本类型传值,把对象中的属性/数组中的数组项赋值给变量,这时变量C是基本数据类型,存储在栈内存中;改变栈中的数据不会影响堆中的数据
console.log(b)	//1,2,3,4
console.log(c)	//1

//改变数值 
b[3] = 6;
c = 7;
console.log(a[3]);	//6 
console.log(a[0]);	//1

赋值过程:

javascript des Javascript的数据结构有哪些?_javascript des_03

总结

变量a为引用类型变量数组,在栈中存储的堆内存中的引用地址。当把变量a赋值给变量b时,传递的值为堆内存中的引用地址。此为传址

当把变量a[0]赋值给变量c时,其传递的实质为基本类型赋值,会将变量a[0]值直接赋值给c,变量a与变量c并未进行引用地址的传递。此为传值