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>
运行结果:
类型不正确