类型转换
任意类型转换字符串
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
obj[true]=23