类型转换&五个falsy值
先来看一下js里面的七种数据类型:
number string boolean null undefined object symbol。
那么这些类型之间是如何转换呢?
//number 转string
var n = 1
n.toString() // '1'
1 + '' // '1' 老司机经常用这种方法 . 加号发现左右任意一边有字符串,他就会尝试把另外一边变成字符串
String(n) // '1'
//boolean转string
var b = true
b.toString() //'true'
true + '' //'true'
String(true) //'true'
//null 和 undefined 没有toString方法
null + '' // 'null'
undefined + '' // 'undefined'
String(null) // 'null'
String(undefined) // 'undefined'
//object 转string
var o = {
name: 'zhangsan'
}
object.toString() // '[object Object]'
object+'' //'[object Object]'
String(object) //'[object Object]'
//其他类型转boolean
Boolean(1) //true
Boolean(0) //false
Boolean('') //false
Boolean(' ') //true
Boolean(null) //false
Boolean(undefined) //false
Boolean({}) //true
Boolean({name: 'zhangsan'}) //true
老司机的方法:
!!1 //true
!!0 //false
!!'' //false
!!' ' //true
!!{} //true
!!undefined //false
!!null //false
重点, JS里面只有这五种数据转成bool是false,背下来!!
0
NaN 前两个的是数字类型
‘’ 空字符串
null
undefined
//转为number
Number('1') //1
parseInt('1', 10) //以十进制转成1
parseFloat('1.23') //1.23
//更骚的方法
'1' - 0 //1
'1.23 ' - 0 // 1.23
JS内存图
先来看一下js里面存放数据的两种内存:
如图所示,一种是栈内存,一种是堆内存,栈内存存放基本的数据类型,堆内存存放复杂数据类型object。
想一下当我们声明一个变量时,他在内存中是如何存放的?
var a = 1
var b = 2
他们在堆内存中是这样的:
当我们执行:
b = a 时放生了什么?
!!!js会把a里面存的值给b
内存图成了这样:
那么对象时如何存放的呢?
是在栈内存中存放堆内存的地址
var o1 = {name: 'zhangsan'}
var o2 = {name: 'lisi'}
看这两个对象的内存图:
当我们执行: o2 = o1时会发生什么?
和上面基本类型做的事情完全一样!!!!:
!!!js会把a里面存的值给b(吧右边的值给左边)
o2里面存放的地址会变成address:100
然后因为地址为106的对象没有人用,js引擎会在适当的时间干掉这个对象,垃圾回收
看一个题目:
答案如下图所示:
a和b刚开始指向同一个对象,地址是101,
执行b={name:‘b’}之后b指向了这个新出来的对象
!!!js会把新对象的值存放在b里面,也就是地址301(吧右边的值给左边)
再看一个题目:
答案如下图:
再看一个题目:
答案如下图: