第三章 基础类型 引用类型
写于平安夜
数据类型有基础类型和引用类型。
由这两种类型导致对数据的操作有两种方式 传值操作和传址操作.
基本数据类型通过传值来操作;引用类型通过传址来操作.
1.数字和布尔类型 是 基本类型,由一些很小的固定数目的字节组成.
2.对象是引用类型,数组和函数属于对象的特殊类型这些数据类型可以包含任意数目的属性或元素,
因为它们无法像固定大小的基本类型值那样很容易地操作
对数据有3中操作
1.复制(我理解为赋值)
传值复制复制的是值,存在着不同的独立的拷贝;
传址复制的是对数值的引用。如果通过这个新的引用修改了数值,这个改变对最初的引用来说也可见。
2.传递(我理解为函数参数)
传值传递 传递给函数的值是一个独立的拷贝,对它的改变在函数外部没影响。
传址传递 传递给函数的是对数值的一个引用。如果函数通过传递给它的引用修改了数值,这个改变在函数外部也可见。
3.比较
传值比较的是两个独立的值,通常逐字比较,以判断它们是否相同。
传址比较的是两个引用,而不是两个引用的值,
对第三个做个实例
var originalDate = new Array(2);
originalDate[0] = '更改前1';
originalDate[1] = '更改前2';
function TestReferencePass(passRef)
{
passRef[0] = '更改后1';
passRef[1] = '更改后2';
}
TestReferencePass(originalDate);
alert('"noriginalDate[0]='+originalDate[0]+'"noriginalDate[1]='+originalDate[1]);
originalDate[0] = '更改前1';
originalDate[1] = '更改前2';
function TestReferencePass(passRef)
{
passRef[0] = '更改后1';
passRef[1] = '更改后2';
}
TestReferencePass(originalDate);
alert('"noriginalDate[0]='+originalDate[0]+'"noriginalDate[1]='+originalDate[1]);
这种对引用进行的更改会影响到函数外的引用类型的数据
但是如果你在函数里面是覆盖了引用类型的数据
这样是不会影响到函数外的引用类型的数据
因为这相当于重新生成了一个引用,相当于重新开辟了一个内存地址
例子如下
var originalDate = new Array(2);
originalDate[0] = '更改前1';
originalDate[1] = '更改前2';
function TestReferencePass(passRef)
{
var newRef = new Array(2);
newRef[0] = '更改后1';
newRef[1] = '更改后2';
passRef = newRef;
}
TestReferencePass(originalDate);
alert('"noriginalDate[0]='+originalDate[0]+'"noriginalDate[1]='+originalDate[1]);
originalDate[0] = '更改前1';
originalDate[1] = '更改前2';
function TestReferencePass(passRef)
{
var newRef = new Array(2);
newRef[0] = '更改后1';
newRef[1] = '更改后2';
passRef = newRef;
}
TestReferencePass(originalDate);
alert('"noriginalDate[0]='+originalDate[0]+'"noriginalDate[1]='+originalDate[1]);