JS_对各类型数据的操作方式_ByValue/ByReference

今天学习了对js各类型数据的操作种类:按值操作、按引用操作,总结如下:

原始类型的number,boolean,是按照值操作的;object类型(包括function,array),是按照引用操作的

所说的操作,体现在三个方面:

复制,参数传递,比较

其实这样来区分,js是出于效率考虑的:number,boolean占用字节少,所以按值操作不会降低效率(copy就copy一个独立的值,参数传递也是传递独立的参数,即使改变其值不影响原来变量,比较也是按照值逐位比较)。而object呢,可能会很大,所以按引用来操作提高效率(copy操作是copy对原变量的引用,参数传递也是传递原变量的引用,改变其值会影响原来变量所指向的值,比较也是比较的引用)。

对于string来说就比较特殊,string是原始类型,但又特殊在其长度可以任意变化,对其操作可以这样理解:复制、传值是按照引用操作的(但string是固定不变的,所以js中并不提供改变其值的方法,如有charAt(),没有setCharAt()),比较方法则是按值比较的,因为js解释器认为比较字符串,就是比较每个字节是否一致。

示例代码:

 1 //copy by value
 2 var n = 1;
 3 var m = n;//m is 1 now.
 4 
 5 //transfer param by value
 6 function changeNumber(m, n) {
 7     m = m + n;
 8 }
 9 changeNumber(m, n);
10 
11 //compare by value
12 if (n == m) {
13     alert('ok');
14 }
15 
16 //copy by reference
17 var d1 = new Date(2015, 11, 25);
18 var d2 = d1;
19 //now ,d2 and d1 refer to a same date obj.
20 alert(d2.toDateString());
21 
22 d1.setDate(10);
23 alert(d2.getDate());//change d1,d2 changed too,for they refer to the same object.
24 
25 
26 function changeArray(array, m) {
27     array[0] = array[0] + m;
28     array[1] = array[1] + m;    
29     array[2] = array[2] + m;
30 }
31 var a1 = [1, 2, 3, 4, 5];
32 changeArray(a1, 3);
33 alert(a1[0]);//4

 

posted on 2015-12-28 22:04  HandyWang  阅读(536)  评论(0编辑  收藏  举报

导航