JS 里的数据类型转换

160 阅读2分钟

其他类型->string

  • .toString()
    其中nullundefined会报错,object不会得到你想要的结果
  • 函数.String()
    + ''功能一样强大
  • 其他类型 + ''
    +如果发现两边有一个字符串,就会想把另外一个也变成字符串。nullundefined都会被改变
1 + '1'
//'11'

null + ''
//'null'

其他类型->boolean

  • 函数Boolean()
  • !!+ 其他类型
!! 1
//true

如果一个位置预期是布尔值,那么JS会将它自动转为布尔值。
falsy是在Boolean上下文中被认定会被转化为false的值,一共有6个。

  • false
  • 0
  • NaN
  • undefined
  • null
  • "" or ''

其他都会被转为true

其他类型->number

Number('1') === 1
parseInt('1s', 10) === 1 //会从头开始转,遇到不能转的就停止,然后输出当前值。后面的10代表转为10进制
parseFloat('1.23') === 1.23
'1' - 0 === 1 //也可以转浮点数,常用这个
+ '1' === 1 //+代表取它原本的数值
- '-1' === 1 //-代表取它原本值的负数 

内存图

对象的引用
a, b取的是Stack中的一个地址,这个地址指向的东西存在了Heap中。当进行b = a时,是把Stack中的地址进行复制。

上面无法实现循环,因为一开始没有声明对象,所以a是undefined。

一个面试题

a.x = a = {n:2};在执行的时候,两个a都已经确定了是取的34那个地址。浏览器是先从左往右看的,然后从右往左算。

垃圾回收

如果一个对象没有被引用,它就是垃圾,就会被回收(浏览器什么时候想回收就什么时候回收)。

即使fn = null之后,fn不会使用Heap。但是function由于被docunment罩着,所不会被回收。

IE6垃圾算法的bug(内存泄漏)

IE6无法在tab关闭的时候,把那些onclick对应的函数标记为垃圾。正常的浏览器看到document死了,会把右边的三个干掉。
解决方法:

把所有的事件监听制为null

深拷贝和浅拷贝

我拷贝了你的值之后,我变了,你不变 ----深拷贝
我拷贝了你的值之后,我变了,你也变了----浅拷贝
(因为我拷贝你的时候,其实只是跟你取的地址相同,我没有独立地再去把你取的地址中的内容拷贝一份)\