javascript 数据类型之 - Object

对象的存储都存堆内存, 在程序中访问和传递, 都按引用值访问和传递, 可类比快捷方式.
实质是一个无序的键值对集合.

创建方式
var obj = {} ;
obj instanceof Object ; // true

var obj2 = new Object({});
obj2 instanceof Object; // true

// 用这种方式会有一点点不一样
var obj3 = Object.create(null);
obj3.__proto__ === undefined; // true
obj3 instanceof Object ; // false

var obj4 = Object.create({});
obj4 instanceof Object; // true
object 拷贝
  • 浅拷贝
var obj1 = {name:'xx'}

var obj2 = { ...obj1 }

obj1 === obj2 ; // false
obj1.name = 'kitty';

console.log(obj1); //  {name: "kitty"}
console.log(obj2); // {name: "xx"}

// 但是对象里面还有对象就情况不一样了
var obj3 = { data:{name:'xx'}}
var obj4 = {...obj3}

obj3.data.name = 'kitty'
console.log(obj4.data.name); // 'kitty'
  • 深拷贝
// 1. 取巧: JSON.parse(JSON.stringify()) 方式
// 最简单偷懒的方式, 但是 obj 存在 Function , RegExp 等时会有一些预料之外的效果
var obj = { data:{name:'xx'}}
var objDeepClone = function(obj){
    return JSON.parse(JSON.stringify(obj));
}

var obj1 = objDeepClone(obj)
obj.data.name = 'kitty'
console.log(obj1.data.name); // 'xx'

// 当出现函数和正则表达式时, function 直接丢失了, 正则表达式的值变成 {}
var obj2 = {say:function(){},reg:/\d+/};
objDeepClone(obj2); // {reg:{}} 

// 2. 尚未经过大量测试验证可行性
// 大体思路,直到到 基本类型的值的时候, 才开始复制, 
// 因为基本类型的复制才是真正的值的复制, 是{} 类型则继续递归
// function(){} , 正则表达式, 数组, 没有做处理,依旧是地址引用
function betterTypeof(data){
    return Object.prototype.toString.call(data)
                           .split(' ')[1]
                           .replace(/\]/, '');
}

var objDeepClone2 = function (obj) {
   var objCopy = {}
   Object.keys(obj).forEach((key) => {
     var _item = obj[key];
     objCopy[key] = (betterTypeof(_item) !== 'Object') 
                  ? _item 
                  : objDeepClone(_item)
   })
   return objCopy
}

// 待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值