参数的特点
- 参数可以有0个或多个
- 函数可以不写参数,在体内用arguments[ ]代替
- 在非严格模式下,arguments对象的值与参数的值双向同步
- 未传递值的命名参数,值为undefined
第一个特点:
ECMAScript的参数在内部是用一个数组表示的,函数接收到的是数组,而不关心数组中包含哪些参数(如果有的话)。实际上,可以通过arguments对象来访问这个参数数组。arguments对象只是与数组类似(并不是Array实例),所以可以使用[ ]访问每一个元素。也可以通过arguments对象的length属性知道有多少个参数传递给函数。
第二个特点:
function setName() {
console.log(arguments[0])//"Tom"
}
setName('Tom')
第三个特点:
function setName(name) {
console.log(arguments[0]);//"Tom"
arguments[0] = "jack";
console.log(name); //"jack"
name = "BOM";
console.log(arguments[0]);//"BOM"
}
let name = "Tom";
setName(name);
第四个特点:
function setName(name) {
console.log(arguments[0]);//undefined
console.log(name); //undefined
}
let name;
setName(name);
变量的访问
ECMAScript变量可能有两种数据类型的值:基本类型的值和引用类型的值。基本类型的值是指简单的数据段,引用类型的值是指可能由多个值组成的对象。
基本类型的值可以直接从栈中直接访问,引用类型的值是按引用访问的。因为引用类型的值是保存在堆内存的对象里,而且JavaScript不允许直接访问堆内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是操作对象的引用而不是实际的对象。
复制变量的值
基本类型的值之间的复制,复制的是值的一个副本且两者完全独立。
例子如下:
let num1 = 5;
let num2 = num1;
引用类型的值之间的复制,复制的是一个指针,该指针指向堆内存的一个对象且两者引用同一个对象。
例子如下:
let obj1 = new Object();
let obj2 = obj1;
obj1.name = "JavaScript";
console.log(obj2.name); //"javaScript"
传递参数
ECMAScript中所有函数的参数都是按值传递的。基本类型的值传递就像基本类型的值复制一样,引用类型的值传递就像引用类型的值复制一样。
在向参数传递基本类型的值时,被传递的值会复制给一个局部变量(参数)。
function add(num) {
num+=10;
return num;
}
let count = 20;
let result = add(count);
console.log(count); //20 说明count,num相互独立
console.log(result); //30
在向参数传递引用类型的值时,会把这个值在栈内存的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数外部。
function setAge(obj) {
obj.age = 18;
}
let person = new Object();
setAge(person);
console.log(person.age); //18 说明obj,person指向同一个对象
参考书籍《JavaScript高级程序设计(第3版)》