纯函数:

  • 相同输入总是会返回相同的输出。
  • 不产生副作用。
  • 不依赖于外部状态。

函数传参:

当一个函数的参数多余两个的时候,应该将参数对象化:

  1. //Bad
  2. const exampleFunc = (a,b,c,d) => {
  3. //do something you need
  4. return a + b + c + d;
  5. }
  6. //when you use this function
  7. exampleFunc(1,3,6,8);
  8. //Good
  9. const exampleFunc = ({num1,num2,num3,num4}) => {
  10. return num1 + num2 + num3 + num4;
  11. }
  12. //when you use this function
  13. exampleFunc({
  14. num1:1,
  15. num2:23,
  16. num3:4,
  17. num4:9
  18. })

ISO Date在IOS设备和非IOS设备的解析不同

  1. function formatISODate2YMD1(date) {
  2. let d = null;
  3. if (date) {
  4. let fullDateStr = date.split('T')[0];
  5. const [year, month, day] = fullDateStr.split('-');
  6. return { year, month, day };
  7. }
  8. return d;
  9. }
  10. function formatISODate2YMD2(date) {
  11. let d = null;
  12. if (date) {
  13. d = new Date(date);
  14. let month = d.getMonth() + 1;
  15. let day = d.getDate() > 9 ? d.getDate() : `0${d.getDate()}`;
  16. let m = month > 9 ? month : `0${month}`;
  17. return { year: d.getFullYear(), month: m, day };
  18. }
  19. return d;
  20. }
  21. let formatRes1 = formatISODate2YMD1('2019-04-23T18:36:35.68');
  22. let formatRes2 = formatISODate2YMD2('2019-04-23T18:36:35.68');
  23. console.log(formatRes1);
  24. console.log(formatRes2);

这是在Chrome浏览器内的执行结果,从结果上来说日期方面基本是一致的:
image.png

但是在实际的H5运用中,IOS中的表现,方法一和方法二的结果是不同的,这里没有办法实测,就不进行截图了。经查得知,IOS中对ISO日期的解析会比其他设备中多算八个小时,也就是说当参数值的时间在当日的下午16点之后,那么实际解析出来的日期就是下一天的日期值。

这是一个坑。

对象深浅拷贝

  1. //浅拷贝
  2. const obj1 = {a:1};
  3. const obj2 = obj1;
  4. obj2.a = 2;
  5. console.log(obj1);//{a:2}
  6. console.log(obj2);//{a:2}
  7. //深拷贝
  8. const obj1 = {a:1}
  9. const obj2 = JSON.parse(JSON.stringfy(obj1));
  10. obj2.a = 2;
  11. console.log(obj1);//{a:1}
  12. console.log(obj2);//{a:2}
  13. //深拷贝 ES6
  14. const obj1 = {a:1};
  15. const obj2 = {...obj1};
  16. const obj3 = Object.assign({},obj2);
  17. obj2.a = 2;
  18. obj3.a = 3;
  19. console.log(obj1);//{a:1}
  20. console.log(obj2);//{a:2}
  21. console.log(obj3);//{a:3}

数组交集、并集、差集ES6

  1. var a = [1,2,3,4,5]
  2. var b = [2,4,6,8,10]
  3. console.log("数组a:", a);
  4. console.log("数组b:", b);
  5. var sa = new Set(a);
  6. var sb = new Set(b);
  7. // 交集
  8. let intersect = a.filter(x => sb.has(x));
  9. // 差集
  10. let minus = a.filter(x => !sb.has(x));
  11. // 补集
  12. let complement = [...a.filter(x => !sb.has(x)), ...b.filter(x => !sa.has(x))];
  13. // 并集
  14. let unionSet = Array.from(new Set([...a, ...b]));
  15. console.log("a与b的交集:", intersect);
  16. console.log("a与b的差集:", minus);
  17. console.log("a与b的补集:", complement);
  18. console.log("a与b的并集:", unionSet);

节流

函数节流 throttle

指定时间间隔内只会执行一次任务 常用于滚动条滚动监听等

  1. function throttle(fn, threshhold) {
  2. var timeout
  3. var start = new Date
  4. var threshhold = threshhold || 160
  5. return function () {
  6. var context = this, args = arguments,
  7. curr = new Date() - 0
  8. clearTimeout(timeout)
  9. if (curr - start >= threshhold) {
  10. fn.apply(context, args) //只执行一部分方法,这些方法是在某个时间段内执行一次
  11. start = curr
  12. } else {
  13. timeout = setTimeout(function () {
  14. fn.apply(context, args)
  15. }, threshhold)
  16. }
  17. }
  18. }

防抖

任务频繁触发的情况下,只有任务触发的间隔超过指定间隔的时候,任务才会执行

即:用户在不触发事件时,才触发相应动作,以抑制本来在事件中要执行的动作。

常用于用户输入验证等

  1. function debounce(func, delay) {
  2. var timeout
  3. return function(e) {
  4. clearTimeout(timeout)
  5. var context = this, args = arguments
  6. timeout = setTimeout(function(){
  7. func.apply(context, args)
  8. },delay)
  9. }
  10. }