就面试笔试题的一些笔记:
- 闭包( 实现add(2)(5) )
- 深复制和浅复制
- 原生js实现Promise
△ –>闭包知识:
实现add(2)(5)
function add (x) {
return function(y) { return x + y; };
}
△ –>深复制和浅复制:
深拷贝 与 浅拷贝: 循环引用和函数是不能通过 stringify 进行深拷贝的
- 对于循环引用和函数是无法通过stringify和parse的方法进行深拷贝的,关于循环引用,可以通过查找循环点来断掉这个循环,再进行深拷贝。
遇到的问题 :
* 解决数组浅拷贝的问题:
直接等于 = arr1=arr2;
slice和concat方法可以进行简单素组的深拷贝
由于数组内部属性值为引用对象,因此使用slice和concat对对象数组的拷贝,整个拷贝还是浅拷贝,拷贝之后数组各个值的指针还是指向相同的存储地址。
因此,slice和concat这两个方法,仅适用于对不包含引用对象的一维数组的深拷贝
解决数组深拷贝的问题:
也是通过 stringify 和 parse 的方法进行深拷贝,解决深拷贝的问题:
先把数据进行stringify转换 ,再进行一次parse转换。
JSON.stringify() 方法是将一个JavaScript值(对象或者数组)转换为一个 JSON字符串
JSON.parse() 方法解析JSON格式数据并构造一个由字符串描述的JavaScript对象/值总结:
- 浅拷贝相当于引用地址的复制,两个变量指针是共享(引用)同一个对象。obj1 === obj2
- 深拷贝相当于为另外一个对象开辟内存空间,并进行递归复制内部属性。两个对象的引用地址是不一样的(即不是引用同一个对象)。obj1 !== obj2
- 可以通过”赋值操作符”、Object.assign()、数组遍历赋值等实现浅拷贝。
- 可以通过自定义代码、JSON对象的方法(JSON.parse和JSON.stringify)、JQuery.extend()等实现深拷贝。
- 目前来说,并没有统一的标准方法来解决”循环引用”,从而实现真正的深拷贝。
比如 react 里面有大量的对象复制,用 immutable 就很好。
对付 deep clone, 最好的办法是抛弃需要 deep clone 的代码实际开发中 除了通过 stringify 和 parse 的方法进行深拷贝,
eg:
let item = JSON.parse(JSON.stringify(temp));
item[‘recharge_principal’] = FormatMoneyByM(temp[‘recharge_principal’]);
为此还采用了其他方式对数据做了处理,
为了避免改变数据的值,直接将通过格式化函数后,加入数组中。不采用中间变量来传递值。
eg:
let temp = data.list [ key ] || { } ;
principal_arr.push ( CalculateMoneyByMm ( temp[ ’ principa l’ ] || 0 ) );
△ –> 用原生js实现promise:
ES6中Promise可以说很大情况下改善了异步回调的嵌套问题
第一:Promise构造函数接受一个函数作为参数,函数里面有两个参数resolve和reject分别作为执行成功或者执行失败的函数
var promise=new Promsie(function(resolve,rejec){
if(/*异步执行成功*/){
resolve(value);
}else{