创建:

值以键值对的方式来书写,冒号分隔。
JavaScript 对象是被命名值的容器。

  • JS
    1.JS对象表示类的实例
    2.不能传输
    3.键值对,键不加双引号,值可以是数字/字符串/布尔/Null/Undefined/数组/函数/对象等
    4.Js对象转换为Json:JSON.stringify(jsobj)
  • JSON串
    1.JSON只是一种数据格式,不存在JSON对象的概念
    2.可以跨平台数据传输,速度快
    3.键值对,键必须加双引号 值不能是方法函数,不能是undefined/NaN
    4.Json转化为js对象:JSON.parse(jsonstring); /Jsobj=eval(“(”+jsonstring+“)”);

遍历对象

const obj = {
            id:1,
            name:'zhangsan',
            age:18}

 for(let key  in obj){
        console.log(key + '---' + obj[key])
  }

深浅拷贝、复制方法:


深浅拷贝:
  • 浅拷贝
    只是拷贝了基本类型的数据,我们把这种拷贝叫做“浅拷贝”。例如对象直接赋值 obja=objb assign()方法等情况
    若父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能。
  • 深拷贝
    就是能够实现真正意义上的数组和对象的拷贝,const copy = Object.assign({}, obj);与{…obj}都能实现一层深拷贝
Object.assign()

这是浅拷贝, 只是拷贝了基本类型的数据,被复制对象属性是数组或另一个对象时会将内存地址复制而非值。
obja=Object.assign(objb);等效 obja=objb 一层深拷贝:const copy = Object.assign({}, obj) 等效const copy = {...obj}

{…obj}扩展运算符

这是一层深拷贝,本质上就是一次遍历赋值,

JSON无引用复制

也算是深拷贝 的一种实现方式

function cloneObjectFn (obj) {              // 对象复制
        return JSON.parse(JSON.stringify(obj));
    }

但这种方式不能复制含有方法的对象,方法再复制过程中会被删除

递归遍历赋值

扩展运算符的衍生,很好理解。把对象的每一层都遍历出来赋值就可以去掉引用。
但很消耗性能。

function deepClone(obj){
  let objClone =  Array.isArray(obj) ? [] : {};
  if (obj && typeof obj === 'object') {
    for(let key in obj){
      if (obj[key] && typeof obj[key] === 'object'){
        objClone[key] = deepClone(obj[key]);
      }else{
        objClone[key] = obj[key]
      }
    }
  }
  return objClone;
}

方法:
MDN Doc JS-API

Object.is()

比较两个值是否相同。所有 NaN 值都相等(这与=不同)。

Object.keys()

返回值是对象中属性名组成的数组var data = {};var arr = Object.keys(data);alert(arr.length == 0);//true

Object.values()

返回给定对象自身可枚举值的数组。

Object.assign()

Object.assign(target, ...sources)可理解为目标对象与多个对象的并集,交集部分被覆盖

  • 将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
  • 通俗讲:通过复制一个或多个对象来创建一个新的对象。
  • 如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似地覆盖前面的源对象的属性。
  • Object.assign()拷贝的是(可枚举)属性值。
    假如源值是一个对象的引用,它仅仅会复制其引用值。
//错误示范
const obj = { a: 1 };
const copy = Object.assign(obj);
console.log(copy); // { a: 1 }
copy.a=10086;
obj.a;//10086  此时会引用同一内存地址


//整错做法
const obj = { a: 1 };
const copy = Object.assign({}, obj);
console.log(copy); // { a: 1 }
//但这样只能实现一层的深拷贝