javaScript(二):类型转换,内存图与深拷贝浅拷贝

169 阅读2分钟

toString

null和Undefined转化会报错

很多地方默认的API都是toString

比如:console.log(),obj[1] = 1

老司机用法

1 + ''
true + ''
obj + ''
null + '''null'
undefined + '''undefined'

window.String

和加''功能相同

Boolean()

五个falsy值:

'',0,NaN,null和undefined转化为boolean为true,其他的都是false

所有的对象都是true

老司机用法

前面加!!转化为布尔

转为Number

五种方法

parseInt会从头开始能parse多少就parse多少

js升级之后在后面加8表示八进制

内存图

内存特点:断电后全部消失 速度快

外存:一直在 速度慢

  1. 变量提升 var a; var b; var 0 ;
  2. 相同引用:赋值之后 o与02指向相同内存(没有指针和箭头,是一个虚拟的示意)
    简单数据类型:直接stack存储 复杂数据类型:引用heap存储
  3. 所有的变量和内存(对象)之间的关系都是引用关系

内存的四个题目

第一题:

parse:stack为直接复制,所以a = 1

第二题:

因为=永远只做一件事情就是把右边的东西拷贝给左边,此时{name:'b'}先开辟一块内存,然后 = 将这块内存的地址拷贝给b,所以a.name == a 第三题

第四题

object循环引用

要先将a存为一个地址才可以

第一行:定义a = undefined, {self:undefined},将这块内存地址给a。

第二行:先声明a是一块内存,然后这块内存的{self:地址}同时把这块内存的地址给a

面试题

parse

因为浏览器是从左向右看,所以a.x = a = {n:2};这句话先看a为34,然后从右向左开始赋值

垃圾回收

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

ie小bug

此时如果将document(当前网页)关闭,则fn成为垃圾,但是ie不认识其为垃圾,所以必须要加上最后一句将其手动变为垃圾

浅拷贝vs深拷贝

定义

浅拷贝:更改b,a改变

深拷贝:更改b,a不改变

对于简单类型,赋值就是深拷贝

深拷贝示意图:不能是同一个地址