1.
传值
(by value)
变量的值被复制出一份
,
与原来的值将不相干
,
也就是说即使新的值被修改
,
原来的值也不会改变
,
在
JavaScript
中基本类型都是传值的
.
function
testPassValue()
{
var
m=1;
var
n=2;
//
将
m,n
的值复制一份
,
传递到
passValue
passValue(m,n);
alert
(m);
//
将是原有的值
}
function
passValue(a,b)
{
a = a+b;
//
改变
a
的值
,
这里
a
只是原有值的一份
copy
alert
(a);
}
输出结果:
3
1
2.
传引用
(by reference).
引用本身复制一份传给
function,
引用指向的对象并没有被复制传递
(java
中也是如此
),
在
function
中
,
如果改变了对象的属性的值
,
由于和原来的引用指向的是同一个对象
,
因此在通过原来的引用访问到的将是修改过的值
;
但是如果只是在
function
中将引用指向一个新的对象
,
将不会改变原对象的值
,
改变的只是复制的这一份引用
.
function
testPassValue()
{
var
date =
new
Date
(2006,02,27);
alert
(date.getDate());
//
输出为
27
//
将
date
引用本身复制一份
,
传递到
passReference,
注意
date
所指向的对象并没有被复
制
passReference(date);
alert
(date.getDate());
//
输出为
12
//
同上
changeReference(date);
alert
(date.getDate());
//
输出还为
12
}
function
passReference(da)
{
//
由于
da
和原引用指向的是同一个对象
,
在
function
外
,
通过原有的引用访问到的将是对象的
日期属性值
,
将是修改之后的值
.
da.setDate(12);
}
function
changeReference(da)
{
//
此时
da
引用实际上是原引用的一份
copy,
将引用本身重新赋值
,
将不会影响原引用
da=
new
Date
(2007,05,11);
//
将
da
引用指向一个新的对象
,
此时原引用指向的还是原来的对象
alert
(da.getDate());
//
输出为
11
}
3
特殊的
String
在
JavaScript
中
,String
也传引用的
. js
中只有
charAt
方法
,
而没有对应的修改方法
,
和
java
中的
String
相同
,
都具有不变性
.
var
s1 =
"hello"
;
var
s2 =
"hell"
+
"o"
;
if
(s1 == s2)
alert
(
"s1 = s2"
)
; //
这句会不会执行
? java
用的熟的人可能会认为不会执行
,
因
为
java
中的
==
比较的是同一性
.
事实上在
js
中对
String==
比较的是值是否相等
,
所以这句
话会执行
.
但是对其他的
Object ==
比较和
java
中一样是同一性
.