JavaScript中的数据转换

今天我们说说数据类型转换的问题,js中有七种类型:

  • number
  • string
  • boolean
  • symbol
  • null
  • undefined
  • object

它们之间是如何进行类型转换的呢?

任意类型转字符串:

String(x)

JavaScript中的数据转换

也可以

toString()

JavaScript中的数据转换

也可以

x + ' '

JavaScript中的数据转换

任意类型转换数字

Number(x)

JavaScript中的数据转换

parseInt(x, 10)  

第一位为参数,第二位可接转换进制,可不写,默认10进制。

 

parseFloat(x)

浮点数的转换

 

任意类型数字转换可简写成 x - 0

JavaScript中的数据转换

也可以写成 + x

JavaScript中的数据转换

 

任意类型转布尔值

Boolean(x)

!!x  双感叹号即可

 

需要记住:七个falsy值(即在boolaen上下文中指定可转换为false的值就叫falsy)

false  0   NaN    ' '  " "  null  undefined 

JavaScript中的数据转换

 

内存图(解释内存如何存放js)

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

遇到引用类型或者基本类型内存存储的问题直接画图,将其变量声明存放的位置画在Stack、Heap中。不用动脑,画完即可得出结论。

 

基于Stack(栈内存)和Heap(堆内存),就引发出了一个问题?深拷贝与浅拷贝是什么鬼?

var a = 1
var b = a
b = 2 //这个时候改变 b
a 完全不受 b 的影响
那么我们就说这是一个深拷贝

对于简单类型的数据来说,赋值就是深拷贝。
对于复杂类型的数据(对象)来说,才要区分浅拷贝和深拷贝。

这是一个浅拷贝的例子

var a = {name: 'yang'}
var b = a
b.name = 'guo'
a.name === 'guo' // true

因为我们对 b 操作后,a 也变了

什么是深拷贝?就是对Heap堆内存进行的完全拷贝。