按照ECMA -262的定义,javascript变量有着与其他语言变量很大的区别,它变量松散类型的本质,决定了它只能在特定的时间内保存特定的值。由于不存在某个变量要必须保存何种数据类型的规则,所以有了变量的值及其数据类型可以在脚本的生命周期中变化。
1、基本数据类型、引用数据类型的值
ECMAscript可能包含两种不同的数据类型的值:基本数据类型 、引用数据类型
基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象。
5种常见的基本数据类型:
- Number
- Sring
- Boolean
- null
- undefined
eg:
let a=10
let b=a
console.log(b)
// b=10
除了这5种之外,还有symbol(es6新增),bigint(es10新增)
基本数据类型的特点:
基本数据类型是按值访问的,我们可以直接操作保存在变量中的值。变量的交换相当于在一个新的作用域开创一个新的空间,新空间与原来的空间互不影响。
除了这几种基本数据类型之外,还有一些引用数据类型。
如:Object、Array、Date、Function
var obj1 = new Object();
var obj2 = obj1;
obj2.name = "javascript对象";
console.log(obj1.name); // javascript对象
引用数据类型的特点:
引用类型值是按引用访问的。 引用类型的值是保存在内存中的对象 javascript不允许直接访问内存中的对象 在操作对象时 实际上是在操作对象的引用
变量的交换并不会创建一个新空间,而是让对象和方法和之前的对象或方法指向同一个空间地址。
总结一下二者的区别:
1、保存方式
- 基本数据类型占据内存空间,存储在内存中的 栈 中,而引用数据类型则是存储在内存中的 堆中
2、复制变量值
- 复制基本数据类型的数值时,其实是创建了这个值的副本,并把副本赋给了新变量。(复制引用数据类型时,会将存储在变量对象中的值复制一份放到为新变量分配的空间中,不同的是,这个值的副本实际上是一个指针,这个指针指向存储在堆中的一个对象)。因此改变其中一个变量就会影响另一个变量。
3、传递参数不同
-
首先要明确ECMAScript中所有的函数的参数都是按值来传递的
变量存储的基本类型的值只是把值传递给参数之后参数和这个变量互不影响
变量存储的引用数据类型值存储的是该引用值在堆内存中的内存地址,因此传递的值就是这个内存地址。当我们要使用一个变量时,首先必须要知道它是哪种类型的。。(javascript数据类型检测)