JS 里的类型
number
类型转
`string`:`toString`、String()全局函数、加上空字符串`boolean:Boolean()全局函数、一个`!`取反,两个`!`取反在取反
string
类型转
`number`:Number()全局函数、parseInt()、parseFloat()、`+`、`-0``boolean`:Boolean()全局函数、一个`!`取反,两个`!`取反在取反
boolean
类型转
`number`:Number()全局函数、`+`、`-0``string`:`toString`、String()全局函数、加上空字符串
null
类型转
`number`:Number()全局函数、`+`、`-0``string`:String()全局函数、加上空字符串`boolean:Boolean()全局函数、一个`!`取反,两个`!`取反在取反
undefined
类型转
`string`:String()全局函数、加上空字符串`boolean:Boolean()全局函数、一个`!`取反,两个`!`取反在取反
object
类型转
`string`:`toSting`、String()全局函数、加上空字符串`boolean:Boolean()全局函数、一个`!`取反,两个`!`取反在取反`null`:`number`
falsy
值:0
、NaN
、''
、null
、undefined
、false
console.log()
利用toString()
方法console.log((1).toString)
内存
简单类型的数据存储在栈内存中
复杂类型的数据存储在堆内存中,栈内存中存储堆内存中的浅拷贝和深拷贝
浅拷贝:只拷贝堆内存中的地址,如果我们重新赋值,原值会改变;简单类型拷贝都是深拷贝;
深拷贝:把栈内存中的内容重新拷贝了一份,堆内存中存储的地址也将变化;如果 b 拷贝 a,改变 b,a 不变是深拷贝;改变 b,a 也跟着变是浅拷贝。var a = {n:1}var b = aa.x = a = {n:2} //a.x 中 a 是确定的,是{n:1}的引用;后面 a = {n:2},a 变成{n:2}的引用,但 a.x 中的 a 是确定的,所以在{n:1}中又加上了{x:{n:2}}console.log(a.x) //undefinedconsole.log(b.x) //{n:2}
深拷贝方法:
方法一:var obj = { age:10, friend:{ name:'xiaoming', age:12, hobby:{ sport:'football', foot:'apple' } }}function copy(object){ var newObj = {} for(var key in object){ if(typeof object[key] === 'string' || typeof object[key] === 'number' || typeof object[key] === 'boolean' || object[key] === undefined || object[key] === null){ newObj[key] = obj[key] }else{ newObj[key] = copy(key) } } return newObj}var obj2 = copy(obj)
如果这样写,对象中的简单类型是深拷贝,而复杂类型是简单拷贝
var obj = { age:10, friend:{ name:'xiaoming', age:12, hobby:{ sport:'football', foot:'apple' } }}function copy(object){ var newObj = {} for(var key in object){ newObj[key] = obj[key] } return newObj}var obj2 = copy(obj)
方法二:
var obj = { age:10, friend:{ name:'xiaoming', age:12, hobby:{ sport:'football', foot:'apple' } }}var obj2 = JSON.parse(JSON.stringify(obj))
循环引用
var a = {}a.self = a
垃圾回收
如果一个对象没有被引用,它就是垃圾,将被引用
var fn = function(){} //fn 被赋值 null 后,这个函数不是垃圾document.body.onclick = fnfn = null