(22)進階:JS 裡的型別
型別轉換
任意型別轉換字串
1.String(x)
2.x.toString()
3.x + ''
任意型別轉換數字
1.Number(x)
2.parseInt(x, 10) 10就是十進位制的意思
3.parseFloat(x) 轉換為浮點數
4.x - 0
5.+x
任意型別轉布林
1.Boolean(x)
2.!!x
falsy包括 false null undefined 0 '' ""
記憶體圖
```javascript
var a = 1
var b = a
b = 2
請問 a 顯示是幾?
```
a顯示1,因為a,b的值分別是在棧記憶體當中的。修改b的值不會影響a的值
```javascript
var a = {name: 'a'}
var b = a
b = {name: 'b'}
請問現在 a.name 是多少?
```
a.name是'a',執行b = {name: 'b'}語句會建立一個新物件,a和b引用不同的物件。
```javascript
var a = {name: 'a'}
var b = a
b.name = 'b'
請問現在 a.name 是多少?
```
a.name是'b',因為a和b是引用相同的物件。b.name = 'b'的更改會影響到a
```javascript
var a = {name: 'a'}
var b = a
b = null
請問現在 a 是什麼?
a是 {name: 'a'},b=null不會影響到a。
深複製
var a = 1
var b = a
b = 2 //這個時候改變 b
a 完全不受 b 的影響
那麼我們就說這是一個深複製
對於簡單型別的資料來說,賦值就是深拷貝。
對於複雜型別的資料(物件)來說,才要區分淺拷貝和深拷貝。
這是一個淺拷貝的例子
var a = {name: 'frank'}
var b = a
b.name = 'b'
a.name === 'b' // true
因為我們對 b 操作後,a 也變了
什麼是深拷貝了,就是對 Heap 記憶體進行完全的拷貝。
var a = {name: 'frank'}
var b = deepClone(a) // deepClone 還不知道怎麼實現
b.name = 'b'
a.name === 'a' // true