数据类型间的转换
- 其他类型转字符串
-
方法:
- toString()
- +’’(‘’为空字符串比较常用)
- Object.Stringify(1)
-
object转字符串值为[object Object]
-
null和undefined无法转字符串
-
1+'1’等于多少?
- 首先,不应该这么写
- 由于加号只能加相同类型,其次加号会优先转成字符串,所以结果为’11’
-
- 其他类型转成布尔(重要)
- 方法:
- 方法一:Boolean(1)
- 方法二:取反两次,比如:!!1
- 数字转布尔,除了0(0为false),其他都为true
- 字符转布尔,除了空字符串(’’),其他都为true
- null转布尔为false
- undefined转布尔为false
- 对象转布尔,都为true
- 函数转布尔, 都为true
- 总结:number中0和NaN为false;String中空字符串为false;null为false;undefined为false;除此之外,其他都是true。(这5个为JS中的falsys)
- 方法:
- 其他类型转number
- 方法:
- Number(“1”)
- parseInt(“1”,10),10为10进制
- parseFloat(“1.23”),转为小数,浮点数只有十进制,所以不用写第二个参数
- ‘1’ - 0 === 1,任何变量-0都是转为number
- +‘1’ === 1
- -‘1’ === 1
- 方法:
- 很场景下,JS会自动转换类型,比如,对象的key必须为字符串,如果是数字,会转成字符串;如果是布尔值,会将布尔转成字符串;如果是变量,会去变量值作为key,又如,if判断的的时候,如果判断条件不是布尔值,会自动将条件转换为布尔:
//例一 var list = { '1':'fff', '2':'ccc' }; list[1]; //ccc //例二 var a = undefined; if(a){ //a自动转为false }
循环引用
var a = {self:a;}; //undefined
undefined的原因是这行代码会被解释为:
var a; //此时a为undefined
a = {self:a}; //a为undefined
var b ={};
b.self = b; //b以及声明,b不会为undefined
b.self.self; //b
GC垃圾回收
如果一个对象没有被引用,它就是垃圾,将被回收。如下:
var fn = function(){};
document.body.onclick = fn;
fn = null; //此时function(){}还被document.body.onclick引用,所以function(){}还不是垃圾
document.body.onclick = null; 此时function(){}还没有被引用,所以function(){}是垃圾
IE6存在bug,无法在页面关闭的时候,把onclick对应的函数标记为垃圾,除非关闭整个浏览器。其他浏览器,关闭页面,onclick引用的函数会被标记为垃圾。IE6bug的解决方式就是在页面退出前,将onclick绑定的函数标记为null,如下:
window.onunload = function(){
document.body.onclick = null; //需要把所有事件都绑定为null
}
深拷贝&浅拷贝
基本类型都是神拷贝,所以一般不用考虑。这里说的深拷贝浅拷贝一般是指对象。
var a = {name:"ffy"};
var b = a; //这里是浅拷贝
b.name = "ffy2";
a.name; //"ffy2"
假如b需要深拷贝,就需要在堆中再开辟一块区域用来存放值。只要改了b的值,a的值会受影响,那就是浅拷贝;反之,则是深拷贝。
几个面试题
var a = 1
var b = a
b = 2
请问 a 显示是几?
var a = {name: 'a'}
var b = a
b = {name: 'b'}
请问现在 a.name 是多少?
var a = {name: 'a'}
var b = a
b.name = 'b'
请问现在 a.name 是多少?
var a = {name: 'a'}
var b = a
b = null
请问现在 a 是什么?
深拷贝&浅拷贝
var a = 1
var b = a
b = 2 //这个时候改变 b
a 完全不受 b 的影响那么我们就说这是一个深复制
基本类型赋值就是深拷贝,所以一般不用考虑。对于复杂类型的数据(对象)来说,才要区分浅拷贝和深拷贝。这是一个浅拷贝的例子。
var a = {name:"ffy"};
var b = a; //这里是浅拷贝
b.name = "ffy2";
a.name; //"ffy2"
假如b需要深拷贝,就需要在堆中再开辟一块区域用来存放值。只要改了b的值,a的值会受影响,那就是浅拷贝;反之,则是深拷贝。