值类型/引用类型
//值类型
let a = 100
let b = a
a = 200
console.log(b) //答案是100
//引用类型
let a = { age:20 }
let b = a
b.age = 21
console.log(a.age) //答案是21
有关存储的知识。值类型是放在栈里的;对象等复杂类型存储在堆里,它们的内存地址指向的是堆,内存地址存放在栈里。引用类型案例中,使a和b的内存地址相同了,则改变b中值的同时也改变了a中的值;而值类型中不会变化。值类型和引用类型严格分离。
常见值类型/常见引用类型
5种值类型:undefined;字符串string;数字型number;布尔值boolean;symbol类型
3种引用类型:对象类型;数组类型;null空类型(特殊引用类型,指针指向为空地址);函数类型(算也不算。特殊引用类型,但不用于存储数据,所以没有“拷贝/复制函数这一说)
typeof运算符
识别所有值类型;识别判断函数;判断是否引用类型,结果都为Object(不可再细分)
深拷贝
function deepCopy(newobj,newobj){
for (var k in obj) {
//判断我们的值属于哪种数据类型
//1.获取属性值 oldobj[k]
var item = oldobj[k]
//2.判断这个值是否是数组
if (item instanceof Array) {
newobj[k] = []
deepCopy(newobj[k],item)
} else if (item instanceof Object) {
//3.判断这个值是否是对象
newobj[k] = {}
deepCopy(newobj[k],item)
} else {
//4.属于简单数据类型
newobj[k] = item
}
}
}
function deepClone(obj = {}) {
if (typeof obj !== 'object || obj == null) {
//obj是null,或者不是对象 和数组,直接返回
return obj
}
//初始化返回结果
let result
if (obj instanceof Array) {
result = []
} else {
result = {}
}
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
//递归调用
result[key] = deepClone(obj[key])
}
}
//返回结果
return result
}
变量计算-类型转换
字符串拼接
==运算符(会造成隐式类型转换,除了==null之外,其他一律使用===,因为==null相当于===null || ===undefined)
if语句和逻辑运算。truly变量:!!a===true的变量;反之falsely变量。
逻辑判断。与或非,判断的返回值。(如console.log(0&&10),返回值是0。