js从原始数据类型到深浅拷贝(个人笔记)

884 阅读2分钟

最近学习总结感觉很多知识都串一起去了,所以今天就把几个知识点一起理一理把。

原始数据类型

  1. number
  2. null   (没有值却存在  这里“没有对象”,即不应该有值)
  3. underfined  (应该有值却不存在,这里"缺少值",就是这里应该有值,但是还没有定义)
  4. boolean
  5. string
  6. object
  7. 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));


最后:

能看到这里的呀,都是人才