ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值。
基本类型值指的是简单数据类型的值,比如:Undefined, Null, Number, Boolean, String类型。
引用类型值指那些可能由多个值构成的对象,比如:Object类型。
如何判断一个变量是否为引用类型呢?
可以通过instanceof方法:
if (variable instanceof Object == true) {
// variable是引用类型
}
下面从三个方面说明基本类型及引用类型的用法及区别。
1, 动态属性
不能给基本类型的值动态添加属性,例如:
var name = "Jack";
name.age = 27;
console.log(name.age); // undefined
可以给引用类型的值动态添加属性,例如:
var person = {};
person.name = "Jack";
console.log(person.name); // "Jack"
2, 复制变量值
基本类型的复制会创建一个新的值,例如:
var str1 = "a";
var str2 = str1;
str1 = "b";
console.log(str2); // "a"
由此可见,str2只是str1的一个副本,两个变量之间可以参与任何操作而不会互相影响。
引用类型的复制则不同,新的变量与原来的变量指向内存中的一个对象,复制操作结束后,两个变量实际上将引用同一个对象。
因此,改变其中一个变量的值,将影响另一个变量。例如:
var obj1 = {};
var obj2 = obj1;
obj1.name = "Jack";
console.log(obj2.name); // "Jack"
3, 传递参数
可以将函数的参数理解为局部变量。基本类型值的传递如同基本类型变量的复制一样,引用类型值的传递如同引用类型变量的复制一样。例如:
基本类型参数:
function add(val) {
val += 10;
return val;
}
var num = 20;
var result = add(num);
console.log(num); // 20
console.log(result); // 30
引用类型参数:
function setName(obj) {
obj.name = "Mark";
}
var person = {};
person.name = "Jack";
setName(person);
console.log(person.name); // "Mark"
总结:
・基本类型值在内存中占据固定大小的空间,因此保存在栈内存中;
・从一个变量向另一个变量复制基本类型值,会创建这个值的一个副本;
・引用类型的值是对象,保存在堆内存中;
・包含引用类型值的变量,实际上包含的并不是对象本身,而是一个指向该对象的指针;
・从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象;
・判断一个值是哪种基本类型可以使用typeof操作符,而判断一个值是哪种引用类型可以使用instanceof操作符;