JS的變數可能包含兩種不同資料型別的值,基本型別和引用型別;
基本型別是指簡單的資料段,引用型別是指可能由多個值構成的物件;
JS高階程式設計第三章介紹了變數分為
5種簡單資料型別(string/number/undefined/null/boolean)--------基本型別(按值訪問):
這五種資料型別是按值訪問的,可以操作儲存在變數中的實際的值.
1個複雜資料型別(object)--------引用型別(按索引訪問):
引用型別的值是儲存在記憶體中的物件;js不予許直接訪問記憶體中的位置,也就是說不能直接操作物件的記憶體空間,
在操作物件時,實際操作的是在操作物件的引用而不是實際的物件.因此,引用物件是按索引訪問的;
ps:嚴謹的說法---當複製儲存著物件的某個變數時,操作的是物件的引用。但在為物件新增屬性時,操作的是實際的物件
動態屬性
我們不能給基本型別新增屬性或方法, 儘管這樣做不會導致任何錯誤, 比如:
var str = '基本型別'; str.name = '新加屬性'; console.log(str.name); // undefined
上面定義了一個基本資料型別string,給了它一個屬性name,但當我訪問他的屬性時發現該屬性不存在,這說明只能給引用型別新增屬性;
接下來的程式碼建立了一個物件並將其儲存在了變數 person 中。然後,我們為該物件新增了一個名為name 的屬性,並將字串值 "Nicholas" 賦給了這個屬性。
緊接著,又通過 console() 函式訪問了這個新屬性。如果物件不被銷燬或者這個屬性不被刪除,則這個屬性將一直存在。
var person = new Object(); person.name = "Nicholas"; console.log(person.name); //"Nicholas
複製變數值
如果從一個變數向另一個變數複製基本型別的值,會在變數物件上覆制一個新值,然後把新值複製到為新變數分配的位置上,這兩個變數可以參與任何操作而不會相互影響;如:
let a = 566; let copy = a; copy = 888; console.log(copy); // 888 console.log(a); // 566
如果將一個引用型別的物件複製給另一個變數,結果就會大相徑庭,因為引用型別是儲存在記憶體中的物件,但js無法直接操作物件的記憶體空間,
這個值的副本實際上是一個指標,而這個指標指向儲存在堆中的一個物件。複製操作結束後,兩個變數實際上將引用同一個物件。因此,改變其中一個變數,就會影響另一個變數;
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name); //"Nicholas"