ARTS第五周

Algorithm

// 原题https://leetcode.com/problems/merge-sorted-array/description/
/**
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

说明:

初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

输出: [1,2,2,3,5,6]

这个题咋一看,好像挺简单,把两个数组合并,然后sort一下就可以了。
但实际上,我们发现,他是把第二个数组合并到第一个,第一个的数组的引用不能改变,最后返回的是第一个
// 我们需要三个指针
1.current用于记录当前填补到哪个位置了
2.m用于记录nums1数组处理到哪个元素了
3.n用于记录nums2数组处理到哪个元素了
从后往前比较,并从后往前插入
*/
/**
 * @param {number[]} nums1
 * @param {number} m
 * @param {number[]} nums2
 * @param {number} n
 * @return {void} Do not return anything, modify nums1 in-place instead.
 */
var merge = function(nums1, m, nums2, n) {
    let curent = nums1.length - 1;
  while(current >= 0) {
    if(n===0) {
      return
    }
    if(m < 1) {
      nums1[current--] nums2[--n]
      continue;
    }
    if(n < 1) {
      nums1[current--] = nums1[--m]
      continue;
    }
    // 取大的填充到nums1的末尾
    if(nums1[m-1] > nums2[n-1]){
      nums1[current--] = nums1[--m]
    } else {
      nums1[current--] = nums2[--n]
    }
  }
};

review

https://blog.cloudflare.com/details-of-the-cloudflare-outage-on-july-2-2019/#appendix-about-regular-expression-backtracking

七月二日Cloudflare停运细节 七月CF的事故造成的影响很大,很多网站都变成了502。这篇文章是这次事故的验尸报告。主要原因有两个:复杂的正则,取消了CPU限制。作为改进,重新引入了CPU限制,并更换了能保证执行时间的正则引擎。最后介绍了有问题的正则原理

tip

当用nginx代理的文件出现contentlength mismatch之后,有可能是nginx截断了返回。

在server中加入proxy_buffering = false
就可以让nginx正常返回

share

数组劫持

定义

数据劫持,也叫数据代理,指的是在访问对象的某个属性时,通过一段代码拦截这个行为,进行额外的操作或者修改返回结果。

实现方式

  • Object.defineProperty(obj, prop, descriptor)
const obj={}
Object.defineProperty(obj, "name", {
  get : function(){
    // 读取属性触发
  },
  set : function(newValue){
    // 设置属性触发
  },
});
  • Proxy对象
const proxy = new Proxy({}, {
  get: function (target, key, receiver) {
   // 读取属性触发
  },
  set: function (target, key, value, receiver) {
   // 设置属性触发
  }
});

场景

  • 拦截对象属性的读取
    题目:什么样的 a 可以满足 (a === 1 && a === 2 && a === 3) === true 呢?
let current = 0;
Object.defineProperty(window, 'a', {
  get () {
    return ++current;
  }
});

console.log(a === 1 && a === 2 && a === 3); // true

Proxy是针对对象的进行拦截的

const obj = {
    a:0,
  };
  
const proxy = new Proxy(obj, {
    get: function(target, property) {
      if(property==='a'){
          return ++target[property];
      }
    }
  });

console.log(proxy.a===1&&proxy.a===2&&proxy.a===3);
  • 拦截对象属性的设置,实现属性私有化或属性检验
  • 多继承

实际应用

  • vue双向数据绑定
  • mobx响应式组件
  • immer拦截常规修改,保持不可变性

你可能感兴趣的:(js开发)