1. await 暂停时会执行async函数以外的代码 返回数据后 解析器会移动到await的下一行继续执行
2. Object.assgin({},target) => 这种方式第一层是深拷贝,第二层是浅拷贝,
3. JSON.parse(JSON.stringify(obj)) => 这种方式只能对属性不是function的有用
采用扩展运算符var a = {...obj}; // 第一层深拷贝,第二层之后都是浅拷贝,同Object.assgin,二者区别参考:object.assign和扩展运算符的区别(扩展运算符对于一维的一般不会相互改变,object.assign要 Object.assign({}, obj) 这样使用)
深拷贝的实现:
a:JSON.parse(JSON.stringify(obj)) => 这种方式只能对属性不是function的有用
b:Object.assgin({},target) => 这种方式第一层是深拷贝,第二层是浅拷贝
c:jquery的JQ.extend
d:采用递归来进行拷贝
e:采用扩展运算符var a = {...obj}; => 同b
-----------------------------------
浅拷贝
直接赋值;
任何操作都会影响原数组;
let obj2 = obj1;
Object.assign;
拷贝属性值,假如属性值是一个对象的引用,那么也会指向那个引用;
let obj2 = Object.assign({},obj1);
Array.prototype.concat();
合并多个数组;
拷贝规则同Object.assign;
let arr2 = arr1.concat(...arr);
Array.prototype.slice();
提取数组;
参数(可选):startIndex,endIndex(与索引值一致);
拷贝规则同Object.assign;
let arr2 = arr1.slice(start,end);
扩展运算符(...);
拷贝规则同Object.assign;
let obj2 = {obj1} or [...obj1];
lodash(_.clone());
拷贝规则同Object.assign;
let obj2 = _.clone(obj1);
-------------------------------------
深拷贝
JSON.parse(JSON.stringify());
不能拷贝函数;
let obj2=JSON.parse(JSON.stringify(obj1));
递归赋值;
function deepClone(obj){
let objClone = Array.isArray(obj)?[]:{};
if(obj && typeof obj==="object"){
for(key in obj){
//判断是否为自身属性
if(obj.hasOwnProperty(key)){
//判断ojb子元素是否为对象,如果是,递归复制
if(obj[key]&&typeof obj[key] ==="object"){
objClone[key] = deepClone(obj[key]);
}else{
//如果不是,简单复制
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
lodash(_.cloneDeep());
let obj2 = _.cloneDeep(obj1);
----------------------------------
createObjectURL 能将图片blob格式转成base64格式
// 2. blob 转 file 类型
let hiBlob = new Blob([`<h1>Hi gauseen!<h1>`], { type: 'text/html' })
let hiFile = new File([ hiBlob ], 'fileName', { type: 'text/html' })