一、类型转换
1. 七种类型的转换
number | string | bollean | symbol | null | undefined | object | |
---|---|---|---|---|---|---|---|
number | 1. X. toString 2. 与''相加 3. String(X) |
1. Boolean(X)函数 2. !!(取反两次) |
|||||
string | 1. Number(X) 2. parseInt('123', 10) 3. parseFloat('1.234') 4. '1' - 0 5. + '1' |
1. Boolean(X)函数 2. !!(取反两次) |
|||||
bollean | 1. x - 0 2. +x |
X. toString 2. 与''相加 3. String(X) |
|||||
symbol | x | ||||||
null | 1. x - 0 2. + x 结果为0 |
1. 与''相加 2. String(X) |
1. Boolean(X)函数 2. !!(取反两次) |
||||
undefined | 1. x - 0 2. + x 结果为NaN |
1. 与''相加 2. String(X) |
1. Boolean(X)函数 2. !!(取反两次) |
||||
object | 1. x - 0 2. + x 结果为NaN |
X. toString 2. 与''相加 3. String(X) 结果为{object: Object} |
1. Boolean(X)函数 2. !!(取反两次) |
2. 转成boolean的五个falsy值
number | string | null | undefined | |
---|---|---|---|---|
false | 0/NaN | '' | null | undefined |
注意:所有object转换成boolean都是true,包括空对象。
二、 内存图
1. JS七种数据类型在内存中的存储位置
基本类型存储在栈内存中,而对象则存在堆内存中,栈内存存储的只是一个指向该堆内存的一个地址。
image.png
2. 初始化各种类型变量时究竟在内存里干了什么
var a = 1
var b = 2
var o = {
name: 'frank',
age: 19
}
var c = true
o.gender = 'male'
var o2 = { name: 'jack', age: 29}
o2 = o
内存图
3. 当把一个对象赋值给另一个对象是发生了什么
o2 = o
仅仅是在栈内存中把o存储的地址复制到o2,并不会在堆内存中创建一个新的对象。
o2 = o
三、内存图习题
image.png
image.png
image.png
- 循环引用
image.png
image.png
上图中在a.x = a = {n:2}
赋值前,a的地址已经定了,第二个赋“=”将a的地址改变了,而第一个“=”左边的a的地址还是原来的34,所以a.x是在原地址指向的对象中添加了x属性。alert(a.x)中的a是新的地址,所以是undefined。
四、垃圾回收
如果一个对象没有被引用,它就是垃圾,将被回收。
image.png
image.png
五、 浅拷贝 VS 深拷贝
有b = a
,改变b的值时a也跟着变为浅拷贝,改变b的值不影响a时即为深拷贝,基本类型的赋值均为深拷贝
深拷贝的内存图:
image.png