1.js数据类型
- 值类型:string、number、boolean、symbol、undefined
- 引用类型:object、function、array、null
值类型和引用类型的区别:值类型的变量存储的是值,而引用类型的变量存储的是地址。当引用类型的赋值变量a赋值给另一个变量b,当b修改属性值的时候,a的值也会跟着改变。看例子:
引用类型:
var obj = {
id: 1
}
var newObj = obj
newObj.id = 2
console.log(obj,newObj) // 两个的id都会变成2
值类型:
var a = 1
var b = a
b=2
console.log(a,b) // 结果1,2
注:null为什么属于引用类型呢?因为可以把null看作一个空指针。
面试题:typeof能返回哪些类型?
答:对于值类型的都返回他本身的数据类型,而对于引用类型返回的是object。所以能返回的类型有:string、number、boolean、symbol、undefined、object
2.浅拷贝和深拷贝
浅拷贝和深拷贝一般都是对于引用数据类型(对象和数组)来说的。
浅拷贝:拷贝的是地址。比如你对a变量进行浅拷贝,当a变量身上的属性发生变化的时候,你也会变化。
深拷贝:拷贝的是值。即你对a变量进行深拷贝,a变量发生变化,也不会影响到你。
-浅拷贝
var obj = { id: 1}
var newObj = obj // 浅拷贝
-深拷贝
方法一:
利用JSON.stringify方法,变成字符串,再利用JSON.parse变回来。这样就完成深拷贝了。
var obj = { id: 1}
var newObj = JSON.parse(JSON.stringify(obj)) // 实现深拷贝
console.log(newObj) // { id: 1}
方法二:
利用深度优先遍历。也可以叫递归吧。
var obj = {
id: 1,
name: 'wjg',
detail: {
address: '中国'
},
arr: [1,2,3,4,5]
}
var newObj = deepClone(obj)
console.log(newObj) // 和a的一样
function deepClone(obj) { // 实现深拷贝
if(typeof obj !== 'object' || obj === null) { // 递归的终止条件
return obj
}
if(obj instanceof Array) { // 判断是数组还是对象
var res = []
} else {
var res = {}
}
for(let key in obj) {
if(obj.hasOwnProperty(key)) { // 防止出现原型链上的属性
res[key] = deepClone(obj[key])
}
}
return res
}