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对象做出了一些限制。即像前面哪有赋值讲会无效;
';