js类型转换和内存

2018-07-24  本文已影响23人  崔磊8080

类型之间的转换

转换为字符串

Console.log打印的都是字符串。

string

string.png

tostring

tostring.png

x+''

这种方法最方便,1+'',但是需要注意,{}+''为0,存在变量里面的空对象可以。

x+.png

转换数字Number

Number(x)

Number(true)
1
Number(null)
0
Number(false)
0

parseInt(x, 10)

parseInt('011')
11
parseInt('011',8)
9
parseInt('011',10)
11
parseInt('s')
NaN
parseInt('1s')
1

parseFloat(x)

x - 0

+x

转换布尔Boolean

Boolean(x)

!!x更常用

是除了下面六个值被转为false,其他值都视为true

js内存图

var a = 1
var b = 2
var c = {
name = 'cuilei'
Age = '24'
}

这些代码对计算机做了什么。

1.变量提升

2.js中64位浮点数存储1,属于stack数据结构。

3.存储object时,使用heap数据结构更灵活,可以后期修改内容。如果使用stack,后期更改顺序,添加删除内容都要更改顺序,很麻烦。stack数据结构的特点。

4.object在stack中存指定地址,地址引用heap中存储的数据。

  1. 你买一个 8G 的内存条
  2. 操作系统开机即占用 512MB
  3. Chrome 打开即占用 1G 内存
  4. Chrome 各每个网页分配一定数量的内存
  5. 这些内存要分给页面渲染器、网络模块、浏览器外壳和 JS 引擎(V8引擎)
  6. JS 引擎将内存分为代码区数据区
  7. 我们只研究数据区
  8. 数据区分为 Stack(栈内存) 和 Heap(堆内存)
  9. 简单类型的数据直接存在 Stack 里
  10. 复杂类型的数据是把 Heap 地址存在 Stack 里

MDN内存管理
基本类型和复杂类型(对象)引用

基本类型变量存的是值,复杂类型的变量存的是内存地址。

基本类型在赋值的时候拷贝值,复杂类型在赋值的时候只拷贝地址,不拷贝值。

var a = {}
a.self = a//self里面存了a的地址
a.self.self.self

垃圾回收

如果对象没有被引用,他就会被垃圾回收。

var fn = function(){}
document.body.onclick = fn
fn = null//fn不是垃圾
页面关掉fn变成垃圾
ie有bug,认为fn不是垃圾

深拷贝和浅拷贝

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
上一篇下一篇

猜你喜欢

热点阅读