Js数组和对象复制和展开语法
stackoverflow好棒: https://stackoverflow.com/questions/3978492/fastest-way-to-duplicate-an-array-in-javascript-slice-vs-for-loop
最快的方式
let a = b.slice(0);
有五种方式
- 循环处理.
- slice
- array.from
- concat
- 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
对象的复制方法
-
object.assign
- 这里特别注意的是, 这是一个’浅’copy, 深层的对象结构会成为引用.
- source可以有多个, 不论多少个, 统统copy到target里面.
- 这个函数的返回值是target.
-
let obj3 = JSON.parse(JSON.stringify(obj1));
- 这个的问题是, 他只copy属性, 不copy方法.
- 其实一般没有问题, 目标对象一般不该是个空对象, 而应该是某个构造函数的实例.
-
let newObj = { …z }; 展开语法, 也是一个shallow(浅)copy
-
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有个反射
- es6提供了reflect静态接口, 这个接口和原本object上面的静态接口很类似.
- https://juejin.im/post/5a0cf3745188254dd935f342
- https://blog.csdn.net/yangzhihello/article/details/46271105
从一个对象的数组生成另一个数组
感谢杭锋给我总体思路和讲解: [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
}
})
))