ECMAScript变量中可能含有两种不同数据类型的值:
基本类型值:保存在栈内存中的简单数据段
引用类型值:保存在堆内存中的对象,变量中保存的实际上是指针,指向内存中保存变量的位置
复制变量值
基本类型值复制:如果从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的地址上。
引用类型值复制:复制到新地址上的实际是一个指向堆内存的地址指针,新变量仍然指向原来的对象
传递参数(Javascript中所有函数的参数都是按值传递的)
function add(num) {
num += 10;
return num;
}
var a = 1;
var result = add(a);
alert(a);
alert(result);
// 以上代码的过程应该是
// 创建全局变量a
// 创建局部变量 num ,将 a 复制给 num , add(num) 操作的是 num ,与a无关
// 创建 result ,复制num 给 result
// add() 函数结束,num 被销毁
// 结果为 a=1 ; result=11 ;
//引用属性:
//引用属性
function setName(obj) {
obj.name = "JS";
}
var person = new Object();
setName(person);
alert(person.name);
// 创建全局对象person
// 将person复制给局部的obj(地址),但obj指向的仍是原来的对象
// 最后原对象的name属性被修改
证明对象是按值传递的
function setName(obj) {
obj.name = "JS"; //此时obj指向的是原对象,所以原对象的name被修改
obj = new Object(); //此时obj指向的是新对象
obj.name = "Aju"; //修改的是新对象的name
//新对象是局部变量,函数执行结束时将被销毁
}
var person = new Object();
setName(person);
alert(person.name);
参考书籍:《Professional JavaScript for Web Developers 3rd Edition》