js类型转换和内存

类型之间的转换 转换为字符串
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)
  • 如果字符串 string 以"0x"或者"0X"开头, 则基数是16 (16进制).
  • 如果字符串 string 以"0"开头, 基数是8(八进制)或者10(十进制),那么具体是哪个基数由实现环境决定。ECMAScript 5 规定使用10,但是并不是所有的浏览器都遵循这个规定。因此,永远都要明确给出radix参数的值。
  • 如果字符串 string 以其它任何值开头,则基数是10 (十进制)。
parseInt('011') 11 parseInt('011',8) 9 parseInt('011',10) 11 parseInt('s') NaN parseInt('1s') 1

parseFloat(x)
x - 0
+x
转换布尔Boolean
【js类型转换和内存】Boolean(x)
!!x更常用
是除了下面六个值被转为false,其他值都视为true
  • undefined
  • null
  • false
  • 0
  • NaN
  • ""''(空字符串)
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

垃圾回收
如果对象没有被引用,他就会被垃圾回收。
js类型转换和内存
文章图片
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

    推荐阅读