美文网首页
js Object对象与深拷贝

js Object对象与深拷贝

作者: 摸摸大海参 | 来源:发表于2019-04-25 15:12 被阅读0次

    在JavaScript里,有一句名言:万物皆可对象。
    Object是JavaScript基本数据类型之一(function也属于object,是特殊的object),其存储于堆中。

    var obj = {}           // 声明空对象
    obj.key = 'xxx'        // 添加属性、赋值
    var res = obj[key]     // 获取属性值
    

    object以键值的方式存储数据,我们可以把多个同一所属的数据存储到一个对象里,例:

    var obj = {
        name: '华为P30 pro',
        price: 5488,
        color: 'black'
    }
    

    Object存储特性

    JavaScript的数据类型分两种,值类型和引用属性,值类型有String、Number等;Object、Array、Function则是引用类型。
    把Object用“等号”赋值给变量,其实是将object所指向的堆中地址赋值给变量,而不是在堆中另开一个空间。

    var obj = { name: 'aaa' }
    var num = obj
    num.name = 'bbb'
    alert(obj.name)        // bbb
    

    alert(obj.name) 显示bbb就可以说明了问题了,obj和num指向堆中同一块内存,当obj或num修改键值时,会使得所有指向这块地址的变量在操作时发生同样的变化。

    深拷贝

    所以,相对于浅拷贝,深拷贝在于开辟新地址,使得变量时不会都受到影响。

    function deepCopy (o, c) {                     // o位被拷贝的对象,c为新对象
      var c = c || {}
      for (var i in o) {
        if (typeof o[i] === 'object') {                //要进行深度复制
          if (o[i].constructor === Array) {
            c[i] = []
          } else {
            c[i] = {}
          }
          deepCopy(o[i], c[i])                   //递归调用
        } else {
          c[i] = o[i]
        }
      }
      return c
    }
    

    相关文章

      网友评论

          本文标题:js Object对象与深拷贝

          本文链接:https://www.haomeiwen.com/subject/yukzgqtx.html