本篇文章给大家谈谈js 函数参数设置默认值,以及js 调用方法中的参数,希望对各位有所帮助,不要忘了收藏本站喔。
基本类型和复合类型的参数传递
对于基本类型参数, JavaScript 采用值传递方式,当通过实参调用函数时,传入函 数里的并不是实参本身 ,而是实参的副本因此在函数中修改参数值并不会对实参有任何影响,看下面程序。
< type="text/java">
//定义一个函数,该函数接受一个参数
function change(argl)
{
//对参数赋值,对实参不会有任何影响
argl = 10;
document.write("函数执行中 argl 的值为 :" + argl + "<br/>");
}
//定义变量x的值为5
var x = 5 ;
//输出函数调用之前x的值
documen.write("函数调用之前x的值为:" + x + "<br>");
change(x) ;
document.write("函数调用之后x的值为" + x + "<br>");
</>
当使用 x 变量作为参数调用 change()函数时, 并未真正传入 change()函数中 ,传入的仅仅是x的副本,因此在 change()中对参数赋值不会影响 x 的值python for语句用法。代码执行结果如图
但对于复合类型的参数,实际上采用的依然是值传递方式 ,只是很容易混淆,看如下程序
< type="text/java">
//定 义函数,该函数接受一个参数
function changeAge(person)
{
//改变 person age 属性
person.age= 10;
//输出 person age 屈性
document.write("函数执行中 person age 值为 :"
+ person.age+ " <br>") ;
//将 person 变蜇直接赋值为 null
person= null;
}
//使用JSON法定义 person 对象
var person= {age : 5};
//输出 person的age 属性
document.write("函数调用之前 person的age 的值为:"
+ person.age + "<br> " );
// 调用函数
changeAge (person) ;
// 输出函数调用后 erson 实例的 age 属性值
document.write("函数调用之后 person age 的值为 :"
+ person.age + "<br>");
document.write("person 对象为:" + person );
</>
上面代码中使用了 JSON 语法创建 person 对象,在上面程序中,传入 changeAge()函数中的不再是基本类型变量,而是一个复合类型变量.
将 person 对象直接赋值为 null,但changeAge()函数执行结束后,后面的 person对象依然是一个对象,并不是 null 这表明 person 本身并未传入 changeAge()函数中,传入 changeAge()函数的依然是副本。
空参数
< type="text/java">
function changeAge(person)
{
if (typeof person== ' object ')
//改变参数的 age 屈性
person . age= 10;
//输出参数的 age 屈性
document.write( "函数执行中 person age 值为 "
+person . age+ "<br /> " );
else
{
alert("参数类型不符合 :" + typeofperson) ;
}
changeAge();
}
</>
上面代码的函数声明中包含了一个参数,但调用函数时并没有传入任何参数。这种形式对于强类型语言,如 Java或C都是不允许的;但对于 JavaScript 却没有任何语法问题,因为JavaScript 会将没有传入实参的参数值自动设置为 undefined 值。
由于 调用函数时对传入的实参并没有要求,即使定义函数时声明了了多个形参,调用函数时也并不强制要求传入相匹配的实参,因此 JavaScript 没有所谓的函数“重载”,对于JavaScript 来说,函数名就是函数的唯一标识
如果先后定义两个同名的函数,它们的形参列表并不相同,这也不是函数重载,这种方式会导致后面定义的函数覆盖前面定义的函数
参数类型
JavaScript 函数声明的参数列表无须类型声明,这是它作为弱类语言的一个特征,但由于声明函数时形参无须定义数据类型,所以导致调用这些函数时可能出现问题。
为了解决弱类型语言所存在的问题,弱类型语言提出了所谓“鸭子类型 Duck Type )"
概念:“鸭子类型”的理论认为 :如果弱类型语言的函数需要接受参数,则应先判断
参数类型,并判断参数是否包含了需要访问的属性、方法。只有当这些条件都满足时,程序才开始真正处理调用 参数 的属性、方法。看如下代码。
< type="text/java">
//定义函数 changeAge, 函数需要一个参数
function changeAge(person)
{
//首先要求 person 必须是对象,而且 person age 属性为 number
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 ('cxx');
changeAge(true);
//采用 JSON 语法创建第一个对象
p = {abc : 34};
changeAge (p);
//采用 JSON 语法创建第二个对象
person= {age : 25} ;
changeAge(person);
</>