JavaScript函数的参数处理

JavaScript函数的参数处理

与java相同,采用值传递方式

基本类型和复合类型的参数传递

基本类型参数,采用值传递,当通过实参调用时,传入函数里的并不是实参本身,而是实参的副本,因此在函数中修改数值并不会对实参有任何影响。

<script>
    function changeAge(person){
        person.age = 10;
        document.write("函数执行中person的age为:"+person.age+"<br/>");
        person = null;
    }
    // 复合类型的变量只是一个引用,不持有对象本身
    var person = {age : 5};
    document.write("函数调用之前中person的age为:"+person.age+"<br/>");
    // 调用函数
    changeAge(person);
    document.write("函数调用之后person的age为:"+person.age+"<br/>");
    document.write("person对象为:"+person);
</script>

运行结果:
函数调用之前中person的age为:5
函数执行中person的age为:10
函数调用之后person的age为:10
person对象为:[object Object]

函数调用之后person只作为一个形参传进去,不修改实参的值,为什么函数调用之后person的age为:10
解释:
复合类型的变量本身并未持有对象本身,复合类型的变量只是一个引 用(类似于 Java 的引用变量),该引用指向实际的 JavaScript 对象。当把 person 复合类型的变 量传入 changeAge()函数时, 传入的依然是 person 变量的副本一只是该副本和原 person 变量指向同一个 JavaScript 对象。因此不管是修改该副本所引用的 JavaScript 对象,还是修改 person 变量所引用的 JavaScript 对象,实际上修改的是同一个对象。

JavaScript 的复合类型包括对象、 数组等。

空参数:

函数定义的时候定义上参数,但是调用的时候可以完全不传入参数,那么参数的数值就是undifined。
所以即使定义多个参数,也可以不要求传入相匹配的参数,所以JavaScript没有函数重载。函数名就是函数的唯一标识。

   <script>
    var fun=function(name,age,school){
        this.name=name;
        this.age=age;
        this.school=school;
        document.write(this.name+'--'+this.age+'--'+this.school);
    }
    fun('小明');
    </script>

运行结果:
小明–undefined–undefined
如果代码中有两个名字相同的函数,代码自上而下执行,下面的函数会覆盖上面的函数。

参数类型

JavaScript 函数声明的参数列表无须类型声明,这是它作为弱类型语言的一个特征 。

function changeAge (p) {
p.setAge (34); 
}

值得注意的是, JavaScript声明的参数列表无须类型声明,因此调用函数时,传入的 p 完全可以是整型变量,或者是布尔型变量,这些类型的数据都没有 setAge()方法,但程序强制调用该方法,肯定导致程序出现错误, 程序非正常中止。
为了解决弱类型语言所存在的问题,弱类型语言提出了所谓“鸭子类型 (Duck Type)" 的 概念 , 他们认为: 当你需要一个“鸭子类型”的参数时,由于编程语言本身是弱类型的,所以 无法保证传入的参数一定是 “鸭子类型”,这时你可以先判断这个对象是否能发出“嘎嘎" 声, 并具有走路左右摇摆的特征,也就是具有“鸭子类型”的特征一-旦该参数具有 “鸭子类型” 的特征 , 即使它不是“鸭子”,程序也可以将它当成“鸭子”使用。 简单地说,“鸭子类型”的理论认为:如果弱类型语言的函数需要接受参数,则应先判断 参数类型,并判断参数是否包含了需要访问的属性、方法。只有当这些条件都满足时,程序才开始真正处理调用参数的属性、 方法。

代码示例:

  <script>
    var fun=function(person){
        if (typeof person=='object' && typeof person.age=='nunber') {
            document.write("--------");
        }else{
            document.write("类型不正确");
        }
    }
    fun('小明');
    </script>

运行结果:
类型不正确

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值