/*
基本資料型別有:
- string
- number
- boolean
- null ** typeof null === 'object' 這只是js的遺留問題,null仍歸屬於普通資料型別
- undefined
*/var string = 'good'
var number = 123
var boolean = true
var nu11 = null
var undef1ned = undefined
/* 陣列與物件都屬於object資料型別 */
var obj = {}
var arr =
var num = 123
var obj =
/* 普通資料型別的值傳遞 */
var num2 = num
console.log(num) // 123
console.log(num2) // 123
num++
console.log(num) // 124
console.log(num2) // 123
num2++
console.log(num) // 124
console.log(num2) //124
/* 通過以上簡單的嘗試可以看到:
普通資料型別的值傳遞,就像轉殖了乙份原資料,新舊資料之間完全獨立
它們的改變都不會影響到對方,這其實就是深拷貝
*//* 引用資料型別的值傳遞 */
var obj2 = obj
console.log(obj2.numinobj) // 456
obj.numinobj = 666
console.log(obj.numinobj) // 666
console.log(obj2.numinobj) // 666
obj.numinobj = 888
console.log(obj.numinobj) // 888
console.log(obj2.numinobj) // 888
/* 可以看到,引用資料型別的值傳遞,與普通型別的值傳遞大不同
引用資料型別的值傳遞的情況: 舊資料像是被人施加巫毒娃娃的效果
對巫毒娃娃的操作(新資料)也會作用到實體身上(舊資料),當然對舊資料
操作也會影響新資料
*/
通過以上的實驗,兩種資料型別的值傳遞情況是不一樣的,那麼導致這種結果的原因是啥呢?這裡直接引出概念堆記憶體
與棧記憶體
。
我們在js中宣告的所有變數,及變數所攜帶的資料都是存在記憶體中的,內存在內部分為堆記憶體
與棧記憶體
,而不同資料型別是儲存在不同記憶體中的
基本資料型別的屬性與屬性值都是直接儲存在棧記憶體中的
普通資料型別的值傳遞,就像轉殖了乙份原資料,新舊資料之間完全獨立,它們的改變都不會影響到對方
引用資料型別,當然指的就是物件、陣列這些。它們的儲存就不是說單純的儲存在堆記憶體或者是棧記憶體中了,而是其屬性名
儲存在棧記憶體
中,屬性值
儲存在堆記憶體
中。此時有人就會想那怎麼能夠保持使得屬性名對應正確的屬性值呢?,答案就是,當我們申明乙個物件時,會在堆記憶體
中開闢乙個區域,區域有標識屬於它的、唯一的記憶體位址值
。往後物件的所有資料都會儲存在將這塊區域中,而在棧記憶體
中的屬性名
通過儲存這個記憶體位址值
,就能正確找到物件和其中的資料了。
// 物件的字面量
引用資料型別的值傳遞的情況: 舊資料像是被人施加巫毒娃娃的效果對巫毒娃娃的操作(新資料)也會作用到實體身上(舊資料),當然對舊資料操作也會影響新資料,最主要的原因就是,它們都指向同一塊記憶體
// 物件的字面量
基本資料型別與引用資料型別
基本資料型別與引用資料型別 基本資料型別 基本資料型別 大小 範圍 預設值 int 整形 32 2147483648 2147483648 0 long 長整形 64 9233372036854477808 9233372036854477808 0 float 浮點形 32 3.40292347e...
基本資料型別與引用資料型別
byte short int long float double boolean charstring class sun提供的 system.class sun提供的 student.calss 程式設計師自定義的 user.class 程式設計師自定義的 product.class程式設計師自定...
基本資料型別與引用資料型別
在談深拷貝與淺拷貝之前,我們先來談談js的資料型別,這對接下來了解深拷貝淺拷貝起到一定的作用。棧記憶體棧是自動分配相對固定大小的記憶體空間,而且由系統自動釋放的。棧是線性結構,後進先出。基本資料型別 null undefined number string boolean symbol es6 基本...