普通类型和对象的区别以及JS 里的数据类型转换

JavaScript 的数据类型,共有七种。
6种为基本类型(Number,String,Boolean,Null,Undefined,Symbol)。
这六种数据类型是存储在栈 (Stack)中的,一行一行存储。
最后一种复杂数据类型Object是存储在堆(Heap)中的,通过引用的方式赋值给变量。

浏览器的JS引擎在得到内存后会划分为两个区域代码区和数据区,在数据区划分为栈内存(Stack)堆内存(Heap)
简单类型的数据之间存在Stack中,复杂类型的数据是把 Heap 地址存在 Stack 里。

第一题
var a = 1
var b = a
b = 2
请问 a 显示是几?
普通类型和对象的区别以及JS 里的数据类型转换_第1张图片
QQ图片20190225152426.png

此时执行b=2直接将 2 的值放在 b 的stack中,如:

普通类型和对象的区别以及JS 里的数据类型转换_第2张图片
QQ图片20190225152540.png

所以b的改变并没有影响到a,a的结果还是1。

第二题
var a = {name: 'a'}
var b = a
b.name = 'b'
请问现在 a.name 是多少?
普通类型和对象的区别以及JS 里的数据类型转换_第3张图片
QQ图片20190225152902.png

当运行至var b = a时a和b的指向相同,此时运行b.name = 'b',更改了heap中地址1中的信息,如图所示。所以这个时候a.name的结果是{name: 'b'}。

浅拷贝和深拷贝

var a = 1
var b = a
b = 2 

上边的代码中当对b改变了,a完全不受影响,即为深拷贝。
对于简单类型中,赋值就是深拷贝。
对于复杂类型(对象),就有深拷贝和浅拷贝一说。因为复杂类型存在引用关系,所以在更改其中一个对象时,两者的指向还是相同的,即存在一个发生变化,另个也一起变化。

浅拷贝则是简单的值的传递,a值传递给b,b值改动时,a值也会改动,以对象为例:

var a = {name: 'frank'}
var b = a
b.name = 'b'
a.name === 'b' // true
GC垃圾回收机制

如果一个对象没有被引用,就是垃圾,将被回收。

var fn = function(){}
document.body.onclick = fn
fn = null
document.body.onclick = null
任意类型转字符串

String(x)
x.toString()
x + ''


普通类型和对象的区别以及JS 里的数据类型转换_第4张图片
QQ图片20190225154139.png
任意类型转布尔

Boolean(x)
!!x

如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为false,其他值都视为true。

undefined
null
false
0
NaN
""或''(空字符串)
任意类型转数字
  1. Number(x)
  2. parseInt(x, 10) MDN
  3. parseFloat(x) MDN
  4. x - 0
  5. +x

你可能感兴趣的:(普通类型和对象的区别以及JS 里的数据类型转换)