JS数据类型(二)

数据类型间的转换

  1. 其他类型转字符串
    • 方法:

      • toString()
      • +’’(‘’为空字符串比较常用)
      • Object.Stringify(1)
    • object转字符串值为[object Object]

    • null和undefined无法转字符串

    • 1+'1’等于多少?

      • 首先,不应该这么写
      • 由于加号只能加相同类型,其次加号会优先转成字符串,所以结果为’11’
  2. 其他类型转成布尔(重要)
    • 方法:
      • 方法一: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)
  3. 其他类型转number
    • 方法:
      • Number(“1”)
      • parseInt(“1”,10),10为10进制
      • parseFloat(“1.23”),转为小数,浮点数只有十进制,所以不用写第二个参数
      • ‘1’ - 0 === 1,任何变量-0都是转为number
      • +‘1’ === 1
      • -‘1’ === 1
  4. 很场景下,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的值会受影响,那就是浅拷贝;反之,则是深拷贝。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值