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 = a
a.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) //undefined
console.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 = fn
fn = null