JavaScript数据类型,赋值、深拷贝、浅拷贝的区别,instanceof

66 阅读1分钟

1.JavaScript数据类型

基本数据类型:undefined,null,boolean(布尔),string , number, symbol

*symbol表示独一无二的值,es6新特性

引用数据类型:object

2.赋值、深拷贝、浅拷贝的区别

赋值:当我们把一个对象赋值给一个新的变量时,其实是把对象在栈中的地址赋值给新变量,而不是把堆中的数据赋值给变量,所以他们指向的是同一个存储空间, 无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。

浅拷贝:重新在堆中创建内存,拷贝前后的基本数据类型互不影响,但拷贝前后对象的引用类型因共享同一块内存,会互相影响。

 function shallowCopy(obj) {
     var target = {}
     for (var i in obj) {
         if (obj.hasOwnProperty(i)) {
             target[i] = obj[i]
         }
    }
    return target
 }

浅拷贝实现方式:

Object.assign()
...(展开运算符,扩展运算符)
concat
lodash clone

深拷贝:从堆内存中开辟一个新的区域存放新对象,对对象中的子对象进行递归拷贝,拷贝前后的两个对象互不影响。

function deepClone(obj){

    if(typeof obj!=='object') return obj
    if (obj === null) return obj
    if (obj instanceof Date) return new Date(obj)
    if (obj instanceof RegExp) return new RegExp(obj)

    var cloneObj=new obj.constructor()

    for(var i in obj){
        if(obj.hasOwnProperty(i)){
             cloneObj[i]=deepClone(obj[i])
        }
    }
}

深拷贝实现方式:

$.extend  
deepClone

3.instanceof

a instanceof b: 指的是b的prototype是否在a的原型链上,a是否是b的实例