[進階 js 02] 賦值


Posted by tzutzu858 on 2021-03-15

[進階 js 01] 變數的資料型態 裡提到 primitive type 和 object 最大差別,除了primitive type 是 Immutable 不能改變以外,還有對於 = 這個賦值這個符號的反應有點不太一樣
例子如下 :

var a = 10
var b = a
console.log(a, b)

b = 200
console.log(a, b)

// 第一個 log 是 10 10
// 第二個 log 是 10 200

想說這樣不是很正常嗎?
讓我們繼續看下去

var obj = {
    number: 10
}
var obj2 = obj
console.log(obj, obj2)

obj2.number = 20
console.log(obj, obj2)

// 第一個 log 是 {number: 10} {number: 10}
// 第二個 log 是 {number: 20} {number: 20}

會發現明明只有改 obj2 的值,但連 obj 也一起被改變,這也是 primitive type 和 object 很大的差別之一

[ JavaScript 06 ] function 傳參數的運作機制裡有提到因為牽扯到底層運作,有圖比較好理解,這邊就不多放一次了


這情形也同樣適用在 array

var arr = []
var arr2 = arr
console.log(arr, arr2)

arr2.push('arr2')
console.log(arr, arr2)

// 第一個 log 是 [] []
// 第二個 log 是 ['arr2'] ['arr2']

因為他們指向同一個記憶體位置,所以改的時候會一起被改到
但今天改成

var arr = []
var arr2 = arr
console.log(arr, arr2)

arr2 = ['arr2']
console.log(arr, arr2)

// 第一個 log 是 [] []
// 第二個 log 是 [] ['arr2']

因為用 = 賦值的時候,意思是會不一樣
arr2 = ['arr2'] 這行做法會是 = 後面先給他一個新的記憶體位置,再去改值


所以如果用 . 代表他指到的記憶體底下的某個屬性
= 代表開一個新的記憶體存一個新的物件










Related Posts

滲透測試重新打底(3.8)--論Web入侵之File Upload攻擊

滲透測試重新打底(3.8)--論Web入侵之File Upload攻擊

從入坑到推坑:給新手的建議

從入坑到推坑:給新手的建議

React(17) - Render props

React(17) - Render props


Comments