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