在自己做東西時,遇見了一個問題。就拿部落格園的首頁右邊的搜尋舉例吧,用主控臺操作。


現在我需要從另外一個地方將資料傳給input,讓其在一重新整理的時候就顯示資料。
這不難啊,於是我按照我的理解做了
程式碼如下:

此時,id為zzk_q的值應該為 測試 ,即input框內應該顯示 測試 。但結果。。

咦,為什麼沒有變呢,不對啊,又來來回回變著法子試一下,還是不行,當然程式碼基本還是那樣子的。突然想起我以前遇見過這樣子的問題,仔細回想當時解決的方法(看樣子當時沒理解透,只是找到方法就過去了),想起來了,我試一下,程式碼如下:

看結果:

這次成了。第一次遇見這個問題時沒有細想,成功了就跳過了。但這次我開始想為什麼呢?為什麼呢?怎麼會這樣啊,沒辦法理解啊。然後我自己在哪裡來回折騰,但還是想不明白。同樣是賦值這倆者有什麼差別嗎?差別在哪裡啊?後來才知道是實值型別和參考型別,當然是別人給我指出來的(……)。
然後我就去找這方面的東西看,發現這東西我看過,汗。
自1997年Javascript被標準化以來,它定義了六種基本型別。直到ES6,JS程式中任何一個值都屬於以下幾種型別之一。
?Undefined
?Null
?Boolean
?Number
?String
?Object
不過,ES6又加了一個基本型別:Symbol 型別。這個沒多大了解,不作討論,等以後熟悉再說吧,又要學。
在JavaScript的變數中,有倆種型別的值:基本型別和參考型別的值。基本型別值(也有人稱為實值型別)是簡單地資料段,它是按值訪問的,並對其中的值進行操作。而參考型別值值那些有可能有多個值構成的物件。賦值的時候,直譯器必須確定值是基本型別還是參考型別。
基本資料型態有:Undefined、Null、Boolean、Number、String。參考型別是儲存在記憶體中的物件,即Object,物件是方法和屬性結合。
1.型別值的動態屬性
這是參考型別:
var person = new Object();
person.name = "foo";
console.log(person.name);//foo
delete person.name;
console.log(person.name)://undefined
這個範例中,我們先建立了一個空物件,然後將其儲存在person變數中,然後給物件新增了一個屬性name,而且給這個屬性賦值了一個字串「foo」,然後輸出,可以看到輸出了字串foo,然後我們將這個屬性刪除,輸出undefined。這些說明,我們可以動態的給物件新增屬性和方法,如果不銷毀物件或者刪除屬性,將會一直存在。
這是基本型別:
var name = "foo";
name.age = 22;
console.log(name.age);//undefined
在這個中,我們將一個字串"foo",儲存在一個name變數中,然後也給它新增了一個屬性age,並賦值22,然後輸出,像我以前想的那麼該輸出22,但實際情況是undefined。
這個是否可以理解為基本型別的值是不可變的,而參考型別是可以動態改變的。
2.複製變數值
和上面說的一樣,基本型別是按值訪問的。而參考型別呢,在JavaScript和其它語言不同,允許直接訪問記憶體中的位置,也就是說我們不可以直接操作物件的記憶體空間,那怎麼辦呢?在操作物件時,實際上是對操作物件的引用,參考型別的值是按引用物件訪問的。參考型別的儲存需要記憶體的棧記憶體和堆記憶體共同完成,棧記憶體儲存變數標識符和指向堆記憶體中該物件的指標,也可以說是該物件在堆記憶體的地址。
先看範例:
var num1 =5;
var num2 =num1;//5
num1+=1; //6
num2;//5
從一個變數向另一個變數複製基本型別的值,我們會在變數物件上重新建立一個新值,然後把該值複製到新變數分配的位置上。這倆個值是完全對立的,對倆個變數進行其他操作是互不影響的。它們應該是儲存在棧記憶體中,如下圖所示:

看一下參考型別:
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "foo";
console.log(obj2.name); //foo
obj2.age = 22;
console.log(obj1.age); //22
當從一個變數想另一個變數複製參考型別的的值時,也會將該值複製一份放到新的空間中。但是就跟上面說的一樣,參考型別的儲存要棧記憶體和堆記憶體一起完成,這個值實際上是一個指標,而這個指標指向儲存在堆中的一個物件。複製操作結束後,倆個變數實際上是同一個指標,也就是引用同一個物件。所以,改變其中的一個變數,另一個變數也會隨之改變。如下圖:

參看 JavaScript高階程式設計。
這樣一梳理,就對一開始的問題有些明白了,開頭那個錯誤,一開始,取到input的value(此時為空),複製給title,然後以改變title期望改變input的value。但input的value(可以看成一個變數)就是一個基本型別,複製後,它倆完全獨立了,互不影響。再說成功的,將value拿出來,先將input(物件)複製給title,然後給title新增value屬性,並賦值,此時倆個指向同一個物件,改變一個,也會影響另外一個。恩,就這樣子。
雖然很多知識從書上或其他地方看了一遍或多遍,但是等你真正遇到時感覺好奇怪。怎麼會這樣,然後自己去找答案。等找到或是別人指出後,才發現這個以前看見過,有些甚至自己解決過(不能說解決,只能說沒有深究,沒有徹底弄懂)。還有一些大學的基礎都忘的七七八八了(本來就學的不好)。連棧記憶體和堆記憶體都去搜了一下。恩,既然決定走這條路了,就好好學習吧。
最後:
Good good coding,day day up!
PS:(集合和參考型別、基本資料型態賦值不一樣)一個簡單的java問題 先後的賦值問題
List list = new ArrayList();
person pp = new person();
list.add(pp);
pp.setIvalue(12);
pp.setIvalue(20);
pp = null;;
int b = 0;
int a = b;
b = 8;
System.out.println(a);
for (person ppp : list) {
ppp.getIvalue();
}
list裡面的物件加進去就改不了,但是可以修改物件裡面的屬性值。
簡單string裡面的值就改變不了
結果:
11
8888
切記:最好還是按正常來寫,避免混淆