es6新增的解构赋值和拓展运算符和Object.assign的知识点

142 阅读3分钟

1.拓展运算符(对象数组都能用)

  • 拓展运算符(...)用于取出参数对象所有可遍历属性然后拷贝到当前对象

  •   let bar = { a: 1, b: 2 };
      let baz = { ...bar }; // { a: 1, b: 2 }
    
  • 上述方法实际上等价于

  •   let bar = { a: 1, b: 2 };
      let baz = Object.assign({}, bar); // { a: 1, b: 2 }
    
  • 可用于合并两个对象

  •   let age = {age: 15};
      let name = {name: "Amy"};
      let person = {...age, ...name};
      person;  //{age: 15, name: "Amy"}
    
  •  自定义的属性和拓展运算符对象里面属性的相同的时候:自定义的属性在拓展运算符后面,则拓展运算符对象内部同名的属性将被覆盖掉。

  •   let person = {name: "Amy", age: 15};
      let someone = { ...person, name: "Mike", age: 17};
      someone;  //{name: "Mike", age: 17}
    
  • 自定义的属性在拓展运算度前面,则变成设置新对象默认属性值

  •   let person = {name: "Amy", age: 15};
      let someone = {name: "Mike", age: 17, ...person};
      someone;  //{name: "Amy", age: 15}
    

1.1拓展运算符的个人补充

  • 首先拓展运算符在对象和数组里都能用,但是写法不太一样,注意和要复制的格式保持一致

  • 拓展运算符用在对象上的时候,和Object.assign是一样的效果,而且两者也有同一个特性,就是有的时候是深克隆,有的时候是浅克隆

1.2 拓展运算符和Object.assign到底是深克隆还是浅克隆(也叫深拷贝和浅拷贝)

  •  深克隆和浅克隆的定义,自己学习,他们有个区别,就是如果b复制了a,如果是浅克隆,改变b,a也会变化,如果是深克隆,改变b,a不会变化
  •   就拿拓展运算符举例,如果b复制a之后,b改变的是基本数据类型(不知道基本数据类型和引用数据类型的,自行百度),那么此时b复制的这个属性就是深克隆,a不会受影响,b改变的是引用数据类型,那么此时b复制的这个属性就是浅克隆,a会受影响

2.解构赋值(对象数组都能用)

2.1 数组的解构赋值

  • 解构赋值是对赋值运算符的扩展,他是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。

  •   基本
      let [a, b, c] = [1, 2, 3];
      // a = 1
      // b = 2
      // c = 3
    
  •   可嵌套
      let [a, [[b], c]] = [1, [[2], 3]];
      // a = 1
      // b = 2
      // c = 3
    
  •   可忽略
      let [a, , b] = [1, 2, 3];
      // a = 1
      // b = 3
    
  •   不完全解构
      let [a = 1, b] = []; // a = 1, b = undefined
    
  •   剩余运算符
      let [a, ...b] = [1, 2, 3];
      //a = 1
      //b = [2, 3]
    
  •    字符串等
      let [a, b, c, d, e] = 'hello';
      // a = 'h'
      // b = 'e'
      // c = 'l'
      // d = 'l'
      // e = 'o'
    
  • 还有其他情况,不过不常见,就不举例了

2.2 对象的解构赋值

  •   基本
      let { foo, bar } = { foo: 'aaa', bar: 'bbb' };
      // foo = 'aaa'
      // bar = 'bbb'
       
      let { baz : foo } = { baz : 'ddd' };
      // foo = 'ddd'
    
  •   可嵌套可忽略
      let obj = {p: ['hello', {y: 'world'}] };
      let {p: [x, { y }] } = obj;
      // x = 'hello'
      // y = 'world'
      let obj = {p: ['hello', {y: 'world'}] };
      let {p: [x, {  }] } = obj;
      // x = 'hello'
    
  •   不完全解构
      let obj = {p: [{y: 'world'}] };
      let {p: [{ y }, x ] } = obj;
      // x = undefined
      // y = 'world' 
    
  •   剩余运算符
      let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40};
      // a = 10
      // b = 20
      // rest = {c: 30, d: 40}
    
    
  •   解构默认值
      let {a = 10, b = 5} = {a: 3};
      // a = 3; b = 5;
      let {a: aa = 10, b: bb = 5} = {a: 3};
      // aa = 3; bb = 5;