最近学习总结感觉很多知识都串一起去了,所以今天就把几个知识点一起理一理把。
原始数据类型
- number
- null (没有值却存在 这里“没有对象”,即不应该有值)
- underfined (应该有值却不存在,这里"缺少值",就是这里应该有值,但是还没有定义)
- boolean
- string
- object
- symbol (ES6新增 唯一性)
基础数据类型可以用typeof来判断,不过要注意其中null,typeof判断null时是object,因为null被转换为机器语言时是很多个0,而只要前三个为零的话,就会被机器语言判断为object。
判断对象数据类型我们用instanceof,其返回值时是个boolean。
let arr = new Array()
arr instanceof Array //true
手写instanceof
function panduan(left,right) {
let leftPo = left.__proto__
let rightPo = right.prototype
while(true) {
if(leftPo== null) {
return false
}
if(leftPo==rightPo) {
return true
}
leftPo=leftPo.__proto__
}}
let arr = new Array()
console.log(panduan(arr,Array));
其实严格来说基本数据类型:number null string boolean Underfined null Symbol 这六种,引用数据类型:Object (Array, Function,Date,RegExp),那么对象类型和原始类型不同之处是什么?
首先原始数据类型存储的是值,而对象类型存储的是地址(指针)
const foo = []
const bar = foo
bar.push(1)
console.log(bar)
foo.push(2)
console.log(foo)
console.log(bar)
打印:
foo.push进去的数,bar也能拿到,说明bar复制的是foo的变量地址(指针)。
然后既然说到了这个复制,及不得不提深浅拷贝了。
深拷贝浅拷贝
我们先来看一张图
这张图其实已经很好的解释深拷贝和浅拷贝的原理:
浅拷贝拷贝的是对象的指针,没有新建空间地址,新老对象公用同一份地址,指向同一地址。修改原来的对象会影响新对象。
深拷贝会申请一段相同的空间地址,并且复制相同的数值,两者互不干扰,改变老的对象并不会影响新的对象。
浅拷贝考点
let a = {
age:1,
jobs:{
first: 'coder'
}}
let b = {...a} //这里jobs也是个对象
a.jobs.first = 'waiter'
console.log(b.jobs.first); //waiter
上面的代码我们将 a对象解构赋值给了b,这个解构其实就是一个浅拷贝,不过let b ={} 还是会新建一个新的空间,但是a对象里面的jobs引用的还是原来的老地址,即复制的还是原来的老地址,所以当jobs中的对象改变时,新的对象也会改变。这是一道典型的浅拷贝的考题。
深拷贝考点
深拷贝我们需要了解的是他的原来,然后手写一个深拷贝;
let a ={
name: {
pop: 'lsj',
music:'chenyixun'
},
age:18}
function copy (obj) {
let copyshen = obj instanceof Array ? {} :[]
for(let key in obj) {
copyshen[key] = obj[key] instanceof Array ? copy(obj[key]) :obj[key]
//这里如果是个对象的话我们需要递归
}
return copyshen
}
console.log(copy(a));
最后:
能看到这里的呀,都是人才