1、值类型和引用类型的区别
值类型:Number、string、bollean、undefined
引用类型:对象、数组、函数、null(空指针)
当需要检测数据类型时,值类型用的是typeof,引用类型用的是instanceof来检测。
值类型和引用类型的区别,我的理解是:一个保存在栈里,一个保存在堆里,值类型的值互相独立且不影响,而引用类型的值属于同一个内存地址,所以一个值改变了,另一个值也会随之改变。
下面看看例子吧~
// 值类型
let a =100
let b = a
a = 200
console.log(b); // 100
结论: a是a,b是b , a的改变,不会影响b,所以输出还是100。
// 引用类型
let A = { age:20 }
let B = A
B.age = 24
console.log(A.age) // 24
结论:一旦赋值了,B改变了,A也会随之改变,如果想要单独改变A的值,可以对其进行深拷贝。
下面来小试牛刀吧 这是常见面试题之一
const obj1 = { a:100 , b: 200}
const obj2 = obj1
let x1 = obj1.b
obj2.a = 103
x1 = 500
console.log(obj1.a); // 103
2、手写深拷贝
// 定义一串数据
const obj1 = {
name: 'zhangsan',
age: 23,
city: 'shenzhen',
arr: ['a', 'b', 'c'],
object: {
x: {
z: 1000
}
}
}
// 使用深拷贝
const obj2 = deepLoop(obj1)
obj1.city = 'beijing'
console.log(obj1.city);
function deepLoop(obj = {}) {
//先判断是不是空值 和 是不是对象 , 不是 则返回
if (typeof obj !== 'object' || obj == null) {
return obj
}
// 定义一个放 存储结果 的空值
var result
// 使用 instanceof 来判断obj是否为数组
if (obj instanceof Array) {
result = []
} else {
result = {}
}
// for in 循环遍历 然后进行递归!
for (let key in obj) {
// 需要保证key 不是原型的属性
if (obj.hasOwnProperty[key]) {
result[key] = deepLoop(obj[key])
}
}
return result
}
3、何时使用双等(==)和全等(===)
if(obj.a==null){
// 这里相当于 obj.a===null || obj.a===undefind 简写形式
//结果是一样的
}
结论:除了null 或 undefined 以外其他一律全等。
== 先尝试为不同类型的值进行转换,然后再比较值是否相等。
===当两边类型相同时,直接对比值,否则返回false
4、typeof能判断哪种类型
(1) 能判断是否为值类型 (undefined string number boolean symbol)
(2) 能判断是否为引用类型(Object Array)
(3) 能判断是否为函数 (Function)
注 : 自己学习整理,如果有不对的地方,还请多多指教,谢谢大家 ~!