stackoverflow好棒: https://stackoverflow.com/questions/3978492/fastest-way-to-duplicate-an-array-in-javascript-slice-vs-for-loop

最快的方式
let a = b.slice(0);
有五种方式
  1. 循环处理.
  2. slice
  3. array.from
  4. concat
  5. es6的spread operator (…), 据说这个最快. 这是一个一元运算符, 他的意思是展开
arr2 = [...arr1];
let xxx [1,2,3];
...xxx; //这个的意思就是: 1,2,3   也就是说, 把整个数组字面展开. 比如我有个函数
function ooo(a, b, c){log(a);};
ooo(...xxx); //这个调用等于: 
ooo(1, 2, 3);

这个展开符号类似于: Object.assign() ,如果对对象执行展开那么两者的区别就很小了.

![]  //这个是false
对象的复制方法
  1. object.assign

    1. 这里特别注意的是, 这是一个’浅’copy, 深层的对象结构会成为引用.
    2. source可以有多个, 不论多少个, 统统copy到target里面.
    3. 这个函数的返回值是target.
  2. let obj3 = JSON.parse(JSON.stringify(obj1));

    1. 这个的问题是, 他只copy属性, 不copy方法.
    2. 其实一般没有问题, 目标对象一般不该是个空对象, 而应该是某个构造函数的实例.
  3. let newObj = { …z }; 展开语法, 也是一个shallow(浅)copy

  4. object.create, 实质上是用另一个object作为目标对象的prototype, 属性和方法都copy过来了.

    var foo = { a : 1 };
    var bar = Object.create(foo);
    foo.a; // 1
    bar.a; // 1
    foo.a = 2;
    bar.a; // 2 - prototype changed
    bar.a = 3;
    foo.a; // Still 2, since setting bar.a makes it an "own" property
    //这里会蒙圈的原因是, bar会影响foo, foo无法影响bar, 因为bar是foo的prototype.
    

    原文地址: https://stackoverflow.com/questions/728360/how-do-i-correctly-clone-a-javascript-object

js有个反射
从一个对象的数组生成另一个数组

感谢杭锋给我总体思路和讲解: [2, 5, , 9].map(it => it).filter(Boolean)

map和filter

let l = [{
		a: "xxxxx",
		b: 123,
	}, {
		a: "xxxouoeuoeuxx",
		b: 333,
	}]
	console.log(JSON.stringify(
		l.map(element => {
			return {
				aaaa: element.a,
				bbbb: element.b
			}
		})
	))