ECMAScript包含两种不同数据类型的值:基本类型值和引用类型值。基本数据类型又称为简单数据类型,复杂数据类型又称为引用数据类型。基本类型值指的是简单的数据段,而引用类型值那些可能有多个值构成的对象。
常用的5种基本数据类型为:Number、String、Boolean、Undefined、Null。其他均为复杂数据类型。
在进行变量赋值时,解析器必须确定这个值是基本类型值还是引用类型值。基本数据类型是按值访问的,因为可以操作保存在变量中的实际的值。而引用类型的值是保存在内存中的对象。JavaScript不允许直接访问内存中的位置,即不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。因此,引用类型的值是按引用访问的。
也就是说,当我们操作基本数据类型时,是直接对值进行操作,而当我们操作引用数据类型时,是根据内存中存放的地址进行操作。
下面举几个例子:
<script>
var a = [10];
var b = a;
a.push(20);
console.log(a); // [10,20]
console.log(b); // [10,20]
</script>
其中b与a指向同一个地址,即数组[10]在内存中存放的地址。所以对该数组进行操作时,a和b的值都会变化。
<script>
var a = { name: "joe" };
var b = a;
b.name = "nick";
console.log(a); // nick
console.log(b); // nick
</script>
其中b与a的值指向同一个地址,即对象{ name: "joe" }在内存中存放的地址。所以对该数组进行操作时,a和b的值都会变化。
<script>
var a = { name: "joe" };
var b = a;
b = { name: "nick" };
console.log(a); // joe
console.log(b); // nick
</script>
b重新创建了一个对象{ name: "nick" }在内存中,b的值为这个新对象在内存中的地址,此时a与b就无关了。