文章目录
参数的特征参数可以有0个或多个功能,并且参数不能写。 在正文中,请改用arguments[]。 在非严格模式下,arguments 对象的值和形参的值是单向同步的。 不明确的
第一个特点:
ECMAScript的参数内部是用链表表示的,函数接收到的也是一个链表,不管字段中包含什么参数(如果有的话)。 事实上,这个参数字段可以通过arguments对象来访问。 Arguments 对象类似于链表(不是 Array 实例)javascript 参数函数,因此您可以使用 [] 来访问每个元素。 您还可以通过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 参数函数,引用类型的值通过引用访问。 因为引用类型的值存储在堆内存的对象中,而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版)》