null
var n = null;
n.toString() //Cannot read property ’toString’ of null
上面报错的意思:toString点前面的是null,因为null没有toString这个API,所以会报错。
如何转String
平时常使用的console.log也是用的tostring方法,把要打印的变成字符串。
String的三种方法:
- toString()
- string函数
- + ''
如何转Boolean
Boolean(x) 如果
- Boolean(0)
- Boolean(NaN)
- Boolean('')
- Boolean(null)
- Boolean(undefined)
上面五个是false,其他是true (五个falsy值)
但是一般转Boolean是这个方法:
!!(x) 取Boolean !!0 !!true
如何转number
'1' -> 1
- Number('1')
- parseInt('1',10)
- parseFloat('1.23')
- '11' - 0 减零
- + '13232' //13232 取正
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'}
例子5
这是一个面试经常错的题
分析如上,在执行到
a.x = a = {n:2}
的时候,这里a的值已经确定好了,不会重复确定a的值了,故alert(a.x) // undefined
-
https://leohxj.gitbooks.io/front-end-database/interview/interview-exercises-with-JavaScript.html(这个例子的参考)
连续赋值
垃圾回收
- 如果一个对象没有被引用,它就是垃圾,将被回收
var fn = function(){}
document.body.onclick = fn
fn = null
问fn
被回收了吗?
答案是没有,因为fn
等于null
了,没有引用这个函数了,应该被回收,但是有document.body.onclick
在引用着,而document不会被浏览器回收的,所以有document罩着,不会被回收。
网友评论