javascript对于全局数组或全局变量修改的疑问
<script>varx=[];vary=0;vartest=function(x,y){this.x=x;this.y=y;}test.prototype={test:...
<script>
var x=[];
var y=0;
var test=function (x,y){
this.x=x;
this.y=y;
}
test.prototype={
test:function(){
this.x.push(23);//这样在之后的alert中可以测得23
this.y++//这样alert得不到1
}
}
Test=new test(x,y);
Test.test();
alert(x+" "+y);
</script>
不知道其中的原理,求解释 展开
var x=[];
var y=0;
var test=function (x,y){
this.x=x;
this.y=y;
}
test.prototype={
test:function(){
this.x.push(23);//这样在之后的alert中可以测得23
this.y++//这样alert得不到1
}
}
Test=new test(x,y);
Test.test();
alert(x+" "+y);
</script>
不知道其中的原理,求解释 展开
2个回答
2012-08-13
展开全部
这个要理解2个问题:
值传递 和 引用传递。除基本类型的数据外(string boolean number)其他都是引用类型。
引用传递的是地址 而不是值。就好像在变量和值之间有个 中间人 ,如果要把这个 变量 赋值给另一个变量,那负责传递的就是那个中间人来做的,这样2个变量都通过同一个中间人接触到值了,也就2个变量共享一个值。如果任一个要改变当前变量的值,那另一个也会知道值改变了,2个变量始终会保持一致。而值传递没有中间人,它是把值直接复制一份再给别的变量。2个变量毫无关系。
var x=[]; //定义引用类型的值
var y=0; //定义值类型的值
var test=function (x,y){
this.x=x;
this.y=y;
}
test.prototype={
test:function(){
this.x.push(23);//当实例对象后此时 局部x 与全局的x 都指向同一个 中间人(地址),共享同 //1个最终值。
this.y++//这样alert得不到1---》alert 取的是全局的那个 y,这里是局部变量,这2个无关。
}
}
Test=new test(x,y);//传人2个全局变量,x 引用类型 y值类型
Test.test();
alert(x+" "+y);//这里的x 是全局对象与Test对象内部X 共享同一个值,故能取到23,而y这里仍然是 最开始定义的全局Y=0
值传递 和 引用传递。除基本类型的数据外(string boolean number)其他都是引用类型。
引用传递的是地址 而不是值。就好像在变量和值之间有个 中间人 ,如果要把这个 变量 赋值给另一个变量,那负责传递的就是那个中间人来做的,这样2个变量都通过同一个中间人接触到值了,也就2个变量共享一个值。如果任一个要改变当前变量的值,那另一个也会知道值改变了,2个变量始终会保持一致。而值传递没有中间人,它是把值直接复制一份再给别的变量。2个变量毫无关系。
var x=[]; //定义引用类型的值
var y=0; //定义值类型的值
var test=function (x,y){
this.x=x;
this.y=y;
}
test.prototype={
test:function(){
this.x.push(23);//当实例对象后此时 局部x 与全局的x 都指向同一个 中间人(地址),共享同 //1个最终值。
this.y++//这样alert得不到1---》alert 取的是全局的那个 y,这里是局部变量,这2个无关。
}
}
Test=new test(x,y);//传人2个全局变量,x 引用类型 y值类型
Test.test();
alert(x+" "+y);//这里的x 是全局对象与Test对象内部X 共享同一个值,故能取到23,而y这里仍然是 最开始定义的全局Y=0
展开全部
LZ的问题在于参数传递的疑惑。
javascript中,【数组和对象】的传递,是按照【地址】进行处理。
如Test=new test(x,y)中的x,x申明为数组,而构造函数中this.x=x语句,是地址操作,即对this.x 的操作等同于x的操作,即this.x.push(23)会改变外部全局变量x的值。
对【字符串和数字】的传递,是按照内容【拷贝】的方式处理,构造函数中的
this.y = y语句,是把y复制了一份,对复制变量进行修改,是不会改变外部全局变量y的值。
关键部分使用【】标识,希望有所帮助,谢谢。
javascript中,【数组和对象】的传递,是按照【地址】进行处理。
如Test=new test(x,y)中的x,x申明为数组,而构造函数中this.x=x语句,是地址操作,即对this.x 的操作等同于x的操作,即this.x.push(23)会改变外部全局变量x的值。
对【字符串和数字】的传递,是按照内容【拷贝】的方式处理,构造函数中的
this.y = y语句,是把y复制了一份,对复制变量进行修改,是不会改变外部全局变量y的值。
关键部分使用【】标识,希望有所帮助,谢谢。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询