上次,我讲了有关类型区别和传递的问题,现在,我给大家在插上一点有关类型赋值的问题。
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
类型赋值类似变量传递的问题。
基本数据类型不必说,传值的。
- var a=5;
- var b=a;
- b=3;
- alert(a);//提示5
- alert(b);//提示3
由此观之,发现改变 b 不会改变 a,因为都是变量的值在来回传递,和变量本身没有关系。
对象类型,传址的。
- var a=new Object();
- a.x=5;
- var b=a;
- b.x=3;
- alert(a.x);//提示3
- alert(b.x);//提示3
这样,由于传址,所以 b 即是 a,a 即是 b,互相改变。
如若还不清楚,再举个例子:
- var a=new Object();
- a.x=5;
- var b=a;
- alert(b.x);//提示5,b.x即a.x,都是5
- a.x=3;//改a.x即改b.x,都是3了
- alert(a.x);//提示3
- alert(b.x);//提示3
不过,对象类型的属性互相赋值,就与对象类型没关系了,就和其属性的类型有关系。
属性是基本数据类型则传值,属性是对象类型则传址。举个例子吧,简单点:
- var a = new Object();
- a.x = 5;
- var b = new Object();
- b.x = a.x;
- b.x = 3;
- alert(a.x); //提示5
- alert(b.x); //提示3
上面来回赋值的不过是两个不同对象的属性,都是互相孤立的,也都是基本数据类型,因此只是互相传值,不会互相影响。
- var a=new Object();
- a.x=5;
- var b=a.x;
- b=3;
- alert(a.x);/提示/5
- alert(b);//提示3
这也是一样,b 这个基本数据类型与 a 的基本数据类型的属性 x 相互赋值,同样不会互相影响,只是互相传值。
可是,对象的属性如果也是对象类型,那就也是传址了。
- var a=new Object();
- a.x=new Object;
- a.x.n=5;
- var b=a.x;
- alert(b.n);//提示5
- b.n=3;//也就改了a.x的n
- alert(a.x.n);//提示3
- alert(b.n);//提示3
a 对象的属性 x,被定义为一个 Object 对象类型。因此 b 赋值为 a.x 时,他们就是互通的了,其实就是同一个了,可以互相影响、改变。 ———— 可是,如果我想让对象类型变量赋值时,只是拷贝属性,而不是达到 "你就是我,我就是你" 的境界、"同生共死" 的高尚品格。怎么办? 木有什么特别好的办法,用下面这个函数吧。 用法 看,修改了 b.x 却不能影响 a.x 了吧? 这个 DeepCopy 是个不错的函数。 上面实现了对象类型的模拟 "传值" 那么怎么做才能模拟基本数据类型的 "传址"? 就是用 Array 对象。 赋值为一个 [xx],其实就是赋值为一个有数据的 Array 对象。这里就是利用含有一个元素的数组来模拟传址。因为数组是对象类型,传递时传址。 当然,你也可以用任意对象类型的属性来模拟。
来源: