JavaScript 里的数据类型转换

任意类型转字符串

  1. String(x)
    JavaScript 里的数据类型转换_第1张图片
  2. x.toString()
    JavaScript 里的数据类型转换_第2张图片
  3. x + ''
    JavaScript 里的数据类型转换_第3张图片

    +运算符会尝试先把两边的东西转换成相同类型(优先字符串)

任意类型转数字

  1. Number(x)
  2. parseInt(x, n)
    n表示x的进制,缺省值为10
  3. parseFloat(x)
  4. x - 0
  5. + x

任意类型转布尔

  1. Boolean(x)
  2. !! x
    JS里只有6个falsy值:0,NaN,false,''(""),null,undefined。
    对象(包括空对象{})全都是 true 。

内存图

内存分为代码区和数据区,数据区分为Stack栈内存和Heap堆内存。
简单类型存放在Stack里。
复杂类型(Object)存放在Heap里,Stack里存放对应Heap里的地址。这种关系叫引用。
画内存图理解问题实例:


JavaScript 里的数据类型转换_第4张图片
实例1

JavaScript 里的数据类型转换_第5张图片
实例2

JavaScript 里的数据类型转换_第6张图片
实例3

JavaScript 里的数据类型转换_第7张图片
实例4

JavaScript 里的数据类型转换_第8张图片
实例5

JavaScript 里的数据类型转换_第9张图片
实例6

GC 垃圾回收

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


JavaScript 里的数据类型转换_第10张图片
此时fn不是垃圾,因为有东西在引用它

JavaScript 里的数据类型转换_第11张图片
如果把页面关闭,document就不存在了,三个对象都成为了垃圾。

IE 6 的 Bug:关闭页面的时候不会把上面的对象当成垃圾,内存会一直占用,除非关闭浏览器。
解决方法:把页面所有监听的事件置为null

window.onunload = function(){
  document.body.onclick = null
}

深拷贝与浅拷贝

在上面的内存图实例1中,b变不影响a,就是深拷贝。
基本类型的赋值都是深拷贝。
在上面的内存图实例3中,b变致a变,就是浅拷贝。
对象的深拷贝需要所有的引用都是独立的,不能和原来的有交差重叠部分。

你可能感兴趣的:(JavaScript 里的数据类型转换)