lesson22

一、类型转换

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
  1. 循环引用
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

你可能感兴趣的:(lesson22)