理解JavaScript函数的参数

本文深入探讨了JavaScript中参数的特点,包括参数可以接受任意数量的值,arguments对象在非严格模式下的同步特性,以及未传递值的参数默认为undefined。同时,解释了变量的访问方式,区分了基本类型和引用类型的区别,并通过实例展示了复制变量值时的不同行为。此外,还详细阐述了JavaScript中函数参数按值传递的原理,通过基本类型和引用类型传递参数的例子来展示其差异。
摘要由CSDN通过智能技术生成

参数的特点

  1. 参数可以有0个或多个
  2. 函数可以不写参数,在体内用arguments[ ]代替
  3. 在非严格模式下,arguments对象的值与参数的值双向同步
  4. 未传递值的命名参数,值为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版)》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值