小志的前端之路

JS 里的类型

2018-03-20  本文已影响0人  小志1

null

var n = null;
n.toString()  //Cannot read property ’toString’ of null

上面报错的意思:toString点前面的是null,因为null没有toString这个API,所以会报错。

如何转String

平时常使用的console.log也是用的tostring方法,把要打印的变成字符串。

String的三种方法:

如何转Boolean

Boolean(x) 如果

如何转number

'1' -> 1

Stack(栈内存) Heap(堆内存)

简单值存Stack地址 :number/string/null/undefined/Symbol/Boolean
复杂值存Heap地址 :Object
因为js没有指针,但是有引用这个概念。所以变量和对象之间的关系都是引用。
等于号只做一件事:把右边的东西存到左边
例子1

var a = 1
var b = a
b = 2
a = ? //1

把1存到a上,b把a的值存到b上,改变b,a存的值不影响,所以是1


stack赋值

例子2

var a = {name : 'a'}
b = a
b = {name : 'b'}
a.name = ? // a

{name = 'a'}存到heap堆里面,a存的是heap的引用,b=a以后
,b也是存的是a的地址的引用,所以b也存的的地址,但是当b变化以后,b存的地址就改变了,没有影响到a的地址,所以a.name = a

不同地址

例子3

var a = {name : 'a'}
b = a
b.name = 'b'
a.name = ? // b

同上,a和b存的是同一个地址,现在b修改的是地址里的值,所以a.name= b

同一地址

例子4

var a = {name : 'a'}
b = a
b = null
a = ? //   {name : 'a'}

一开始存到都是同一个地址,但是null赋给b以后,b就不指向a的地址了,不影响a,所以a = {name : 'a'}

null赋值
例子5
这是一个面试经常错的题
分析如上,在执行到a.x = a = {n:2}的时候,这里a的值已经确定好了,不会重复确定a的值了,故alert(a.x) // undefined

垃圾回收

var fn = function(){}
document.body.onclick = fn
fn = null

fn被回收了吗?
答案是没有,因为fn等于null了,没有引用这个函数了,应该被回收,但是有document.body.onclick在引用着,而document不会被浏览器回收的,所以有document罩着,不会被回收。

垃圾回收
上一篇 下一篇

猜你喜欢

热点阅读