基本类型和复合类型的参数传递
对于基本类型函数,Javascript采用值传递方式,当通过实参调用函数时,传入函数里的并不是实参本身,而是实参的副本,因此在函数中修改参数值并不会对实参有任何影响
<script>
function changeAge(person){
person.age = 10;
document.write("函数执行中的age为"+person.age+"<br>");
person = null;
}
var person = {age : 5};
document.write("函数调用之前的age为"+person.age+"<br>");
changeAge(person);
document.write("函数调用之后的age为"+person.age+"<br>");
document.write("person对象为"+person+"<br>");
</script>
结果为
由此可以看出复合类型的变量本身并未持有对象本身,符合类型的变量只是一个引用,该引用指向实际Javascript对象
空参数
<script>
function changeAge(person){
if(typeof person == 'object'){
person.age = 10;
document.write("函数执行中person的age值为:"+person.age+"<br>");
}
else{
alert("参数类型不符合:"+typeof person);
}
}
changeAge();
</script>
上面代码的函数声明了中包含了一个参数,但调用函数时并没有传入任何参数。这种形式对于强类型语言如Java或C都是不允许的;但对于JavaScript却没有任何语法问题
对于JavaScript来说,函数名就是函数的唯一标识
如果先后定义两个同名的函数,他们的形参列表并不相同,这也不是函数重载,这种方式会导致后面定义的函数覆盖前面定义的函数
参数类型
Javascript函数声明的参数列表无需类型声明
值得注意的是,Javascript无需类型声明,因此调用函数时传入的p完全可以是整型变量或者是布尔型变量。这些类型的数据都没有setAge()方法,但程序强制调用该方法,肯定导致程序出现错误,程序非正常终止。
为解决这个问题,弱类型语言提出了所谓“鸭子类型”的概念。
<script>
function changeAge(person){
if(typeof person =='object'
&& typeof person.age == 'number'){
document.write("函数执行前person的age值为:"+person.age+"<br>");
person.age = 10;
document.write("函数执行中person的age值为:"+person.age+"<br>");
}
else{
document.writeln("参数类型不符合"+typeof person +"<br>");
}
}
changeAge();
changeAge('xxx');
changeAge(true);
p = {abc : 34};
changeAge(p);
person = {age :25};
changeAge(person);
</script>
这种语法要求:函数对参数执行逻辑操作之前,首先判断参数的数据类型,并检查参数的属性是否符合要求,当所有的要求满足后才执行逻辑操作;否则弹出警告。