Javascript函数传参

理解参数:

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

posted @ 2018-01-04 14:55  孤鸟的悲歌丶  阅读(197)  评论(0编辑  收藏  举报