JavaScript传参的问题
最后更新于:2022-04-01 11:43:46
**理解参数:**
JS函数的参数与大多数其他语言中函数的参数有所不同,JS函数不介意传递进来多少个参数,也不在乎传递进来的参数是什么数据类型。也就是说,即便你定义的函数只接收两个参数,在调用这个函数也未必一定要传递两个参数。可以传递一个,三个甚至不传递参数,而解析器永远也不会有什么怨言。原因是JavaScript中的参数在内部是用一个数组来表示的。函数接受到始终是这个数组,而不关心数组包含多少元素和参数。实际上在函数体内可以通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。
其实,arguments对象只是与数组类似(它并不是array的实例),因为可以使用方括号语法访问它的每一个元素(即第一个元素是arguments[0],第二个下标为1,以此类推),使用length属性来确定传递进来多少个参数。
~~~
function hello(){
alert(arguments[0]+":"+arguments[1]);
}
hello('姓名','张三');
~~~
JS如何实现重载:
在JS里面本身是没有重载这个概念的,但是JS可以在运行时重写我们的参数以及改变参数类型,这一点很类型与Java的重载;
~~~
public class Test {
public void outPut(String name){
System.out.println(name);
}
public void outPut(String name,String address){
System.out.println(name+":"+address);
}
public static void main(String[] args) {
Test test=new Test();
test.outPut("张三", "上海");
}
}
~~~
上面这段代码是Java的重载,它在运行的时候会根据方法的参数类型以及个数去匹配对应的参数;
~~~
function outPut(){
if(arguments.length==1){
alert(arguments[0]);
}else{
alert(arguments[0]+":"+arguments[1]);
}
};
outPut('张三','上海');
~~~
上面这段代码类似于JS的重载,即判断一下参数的个数,来得到去对应的参数信息;
另一个与参数有关的重要方面就是arguments对象可以与命名参数一起使用;
~~~
function outPut(name,address){
if(arguments.length==1){
alert(arguments[0]);
}else{
alert(arguments[0]+":"+address);
}
};
outPut('张三','上海');
~~~
关于arguments还有一个比较有意思的事,就是他的值会永远与命名参数的值保持同步;即我修改了name的值,那么他的arguments[0]的值也会发生改变,这一点跟Java很类似。不过这并不是说两个值访问的都是相同的内存空间;他们的的内存是独立的。但他们的值会同步,这种影响是双向的,即你修改命名参数的值会改变arguments中对应的值,修改arguments的值也会改变参数的值;
~~~
function outPut(name,address){
name="李四";
arguments[1]="武汉";
if(arguments.length==1){
alert(arguments[0]);
}else{
alert(arguments[0]+":"+address);
}
};
outPut('张三','上海');
~~~
关于参数还要记住最后一点,没有传递值的命名参数将自动被赋予undefined值。这就跟定义了遍历但还没有初始化一样。严格模式对如何使用arguments对象做出了一些限制。即像前面哪有赋值讲会无效;