动态类型
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种基本数据类型:Boolean、Null、Undefined、Number、BigInt、String、Symbol
1种引用数据类型:Object
基本数据类型
基本数据类型是指存放在栈中的简单数据段,数据大小确定,内存空间大小可以分配,它们是直接按值存放的,所以可以直接按值访问。
var a = 10
var b = a;
b = 20
console.log(a) // 10值
console.log(b); // 20值
赋值过程:
引用数据类型
引用数据类型是存放在堆内存中的对象。变量其实是保存的在栈内存中的一个指针(保存的是堆内存中的引用地址,这个指针指向堆内存中的引用地址。通过这个引用地址可以快速查找到保存中堆内存中的对象。
注意:与其他语言的不同是,JavaScript没有按引用传递,而是传递引用类型的参数(是按值传递),不可以直接访问堆内存空间中的位置和操作堆内存空间,只能操作对象在栈内存中的引用地址。
var obj1 = new Object();
var obj2 = obj1;
obj2.name = "测试名称";
console.log(obj1.name); // 测试名称
console.log(obj2.name); // 测试名称
赋值过程:
综合案例:
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
赋值过程:
总结
变量a为引用类型变量数组,在栈中存储的堆内存中的引用地址。当把变量a赋值给变量b时,传递的值为堆内存中的引用地址。此为传址。
当把变量a[0]赋值给变量c时,其传递的实质为基本类型赋值,会将变量a[0]值直接赋值给c,变量a与变量c并未进行引用地址的传递。此为传值。