JS参数理解(基本类型和引用类型)

JS参数理解

用过JS的同学肯定知道,JavaScript中,函数的参数简直就是”怪胎“!
1、不规定参数个数
2、不规定参数类型
3、参数随便传。。。

为什么会这样呢?Java里面可是靠参数个数,参数类型来实现重载的啊,JS中怎么抛弃了这样一个设计思路呢?JS的参数到底是何方神圣。。。让我们一探究竟!

原来,在ECMAScript中,参数在内部是用一个数组来表示的,函数接收到的始终是这个数组,而数组中包含什么,完全不管。函数体内通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。

arguments对象只是类数组对象(不是Array的实例),具体它是什么我也不知道啦。
但是,既然形参会被封装成数组(或者说是类数组)对象进行传递,那么我们就可以通过arguments[0],arguments[1]…..
arguments.length等来获取参数和传递参数的个数。

function sayHi(){
    alert("Hello"+arguments[0]+","+arguments[1]);
    //不管传递进来什么,都可以执行,就算不传递参数,sayHi();直接调用,参数也会被赋值undefined。
}

JS版重载:
arguments对象与命名参数一起使用可以实现重载。

function doAdd(num1,num2){
    if(arguments.length==1){
        alert(num1+10);
    }else if(arguments.length==2){
        alert(arguments[0]+num2);
    }

}

注意:arguments的值与永远与对应命名参数的值保持同步。但是他们的内存空间是独立的。

基本类型和引用类型

其实在整个JS函数参数理解过程中,我们要理解一个非常重要的概念,就是我们的值类型存在基本类型和引用类型两种,核心理解就两点:
1.基本类型(一般指简单的数据段),按值访问,可以操作保存在变量中的实际值。以栈形式存储。
2.引用类型(一般指对象),保存在内存中的对象,操作对象引用,不能直接操作实际值。以堆形式存储。
(当然这里说法不严谨,当复制保存对象的变量时,操作的是对象的引用;当给对象添加属性时,操作的是实际的对象,也就是操作的是对象在内存中的实际值。)

注意:对于引用类型再多说几句,当复制变量时,基本类型是重新创建了一个变量副本并重新分配新的内存空间;引用类型复制时也会创建副本,但是这个副本是一个指针,指向存储在堆中的对象,他们操作的是同一个地址,所以会产生相应的同步变化当执行一些操作时。

最后,我们来讨论一个例子。

function setName(obj){
    obj.name="向朔";

    obj=new Object();
    obj.name="xiangshuo";
}
var person = new Object();
setName(person);
alert(person.name); //向朔

看到这个例子,可能第一感觉会觉得是“xiangshuo”,但是实际结果是“向朔”。为什么是这样的呢?我们来分析一下。

首先,新创建了一个对象赋值给person,然后调用函数setName(person),最后调用alert()函数。
在整个过程中我们分析一下调用setName(person)过程中发生了什么。

person对象传递进来之后,给它的内存中的实际值添加了属性name;在setName()函数中,新创建一个对象赋值给变量obj,同时添加name属性,在内部修改了参数的值,但原始的引用仍然未变。

实际上,这里涉及到一个作用域的问题,当obj=new Object();时,变量引用的只是函数内的局部对象,这个局部对象在函数执行完毕之后立即销毁。所以在函数外部调用函数的时候,是访问不到局部对象的。

关于作用域,下回学习的时候再写个总结。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值