访问变量的方式
-
- 按值(基本类型:string、number、boolean 存放在栈内存中)
-
- 按引用(引用类型:Object 存放在堆内存中)
参数传值
所有的函数的参数都是按值传递。 换句话说,所有参数都是将传进来的值进行了copy。参数实际上是函数的局部变量,在调用函数传参时,就是将值向参数进行复制。
基本类型的复制
基本类型的复制:基本类型存在栈内存中,复制时,就是直接在栈内存新开辟出空间,将复制的值放进去;变量指针指向的是不同的内存地址。如下
var number = 1
var number2 = number
引用类型的复制
引用类型的复制:引用类型的对象存在堆内存中,栈中存放的是对象在堆内存中的地址,在进行复制时,其实和基本类型的复制一样,区别是,在此复制的是内存地址。所以,值复制后,两个变量的值都是同一个内存地址。
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name);//'Nicholas'
对于为啥不是按引用传值,大家可以测试下,在函数内部去改变参数的指向,会发现函数外的值的指向并没有变
function setName(obj) {
obj.name = "Nicholas";
//改变参数的指向
obj = new Object();
obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"