一、数据类型转换
Anything-->string
① ''+?
转成字符串的简便方法
1+1=2; 1+'1'='11'(不同类型相加只会优先自动转成字符串,因为没有意义)
② x.toString()
x不能是null,undefined
③ String()
其余五种数据类型都可以转换,注意String({})==="[Object Object]"Anything-->boolean
①Boolean(x)
除了五个falsy值以外的x的布尔值都是true,所有的对象都是true
五个falsy值:0,NaN;'';null;undefined
②!!x
取得布尔值的简便方法
3.转成number
- '1' ---1
①Number('1')===1
②parseInt('1')===1
parseInt('1x')===1 | parseInt('011')===11 | parseInt('011',8)===17
③parseFloat('1.23')===1
④'1'-0===1
'1.23'-0===1.23
⑤+'1'===1
+'-1'===-1
+'1.23'===1.23
自动转换
obj[1]=2,1自动转换成'1',因为key只接受字符串
1 vs new number(1):一个存在stack,一个存在heap
二、内存(重要概念:内存图)
数据存储在电脑中的形式:
ECMASript规定,数字以64位浮点数形式储存(1与1.0是相同的,是同一个数),字符串以16位数存储。
数据如何存储在内存中:
简单的:number/string/null/undefined/symbol/boolean,储存在stack
复杂的:object,存heap地址存入stack,引用关系
弄懂4道关于内存的题目
1.var a = 1
var b = a
b = 2
a=1
2.var a={name:'a'}
b=a
b={name:'b'}
a.name=?
?='a'
3.var a ={name:'a'}
var b=a
b.name='b'
a.name=?
?='a'
4.var a ={name:'a'}
var b=a
b=null
a=?
?={name:'a'}
循环引用
var a //a===undefined
a={self:a}
a={self:undefined}
引用:
var a={}
a.self = a //把a的地址赋给self
a.self.self ==={self:{...}}
关于引用的面试题:
var a ={n:1};
var b=a;
a.x = a ={n:2}; //画内存图,a.x是a第一次的地址,右边的a是{n:2}的地址
alert(a.x); // -->undefined
alert(b.x); // -->[object object]
垃圾回收:如果一个对象没有被引用,它就是垃圾,将被回收(将内存还回去)
var fn = function(){}
document.body.onclick = fn
var fn = null //画内存图,function(){}不是垃圾,document.body.onclick引用了它,所以它不会被回收
IE6 BUG:一般浏览器,当你关闭时,function(){}会被当成垃圾回收,因为document没了,document.body自然也没有,document.body.onclick也没有,function(){}没有被什么东西引用。
但IE6不把function(){}当成垃圾回收掉,使其一直占着内存。解决办法:
window.onunload = function(){
document.body.onclick = null
document.body.onmouse=null
....
} //把监听的事件都标为null
深拷贝 VS 浅拷贝
深拷贝(所有基本数据类型的赋值都是深拷贝):
var a =1
var b=a
b=2
a===1
特点:b变不影响a变
浅拷贝
var a ={name:'a'}
var b=a
b.name='b'
a.name = 'b'
特点::b变致a变