阿里面试题整理(其一)

输入 url 到渲染的过程

1.在浏览器中输入一个 URL 2.通过 DNS 将域名解析成 IP 地址。域名只是与 IP 地址的一个映射。域名解析的过程实际是将域名还原为 IP 地址的过程(如果输入的是 IP 地址,此步骤省略) 3.根据解析到的 IP 地址加端口 ,浏览器发起 http 请求 4.浏览器建立一条与服务器的 tcp 连接(建立过程:三次握手)

  • 第一次握手: 建立连接时,客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SENT 状态,等待服务器确认;
  • 第二次握手: 服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;
  • 第三次握手: 客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED(TCP 连接成功)状态,完成三次握手。
  • 第一次挥手:Client 发送一个 FIN,用来关闭 Client 到 Server 的数据传送,Client 进入 FIN_WAIT_1 状态。
  • 第二次挥手:Server 收到 FIN 后,发送一个 ACK 给 Client,确认序号为收到序号+1(与 SYN 相同,一个 FIN 占用一个序号),Server 进入 CLOSE_WAIT 状态。
  • 第三次挥手:Server 发送一个 FIN,用来关闭 Server 到 Client 的数据传送,Server 进入 LAST_ACK 状态。
  • 第四次挥手:Client 收到 FIN 后,Client 进入 TIME_WAIT 状态,接着发送一个 ACK 给 Server,确认序号为收到序号+1,Server 进入 CLOSED 状态,完成四次挥手。 5.浏览器通过 tcp 的三次握手建立好连接后,便向服务器发送 HTTP 请求,请求数据包 6.服务器收到并处理 HTTP 请求,根据请求信息去查找资源,返回响应信息 7.浏览器接收 HTTP 响应 8.如果报文中的状态码表示请求成功,则接受返回的资源(如 HTML 文件),至此浏览器已经拿到了一个 HTML 文档,并为了呈现文档而开始解析。 11.至此浏览器已经拿到了一个 HTML 文档,并为了呈现文档而开始解析。 12.页面全部渲染结束。 13.四次挥手关掉 TCP 连接。

拍平对象

function copy(input) {
    
    
  let result = {
    
    };
  const flatten = (params, key) => {
    
    
    if (params instanceof Array) {
    
    
      params.forEach((param, index) => {
    
    
        if (param instanceof Object || param instanceof Array) {
    
    
          flatten(param, `${
      
      key}[${
      
      index}]`);
        } else {
    
    
          result[`${
      
      key}[${
      
      index}]`] = flatten(param, `${
      
      key}[${
      
      index}]`);
        }
      });
    } else if (params instanceof Object) {
    
    
      for (var itemKey in params) {
    
    
        const itemValue = params[itemKey];
        if (itemValue instanceof Array) {
    
    
          flatten(itemValue, itemKey);
        } else if (itemValue instanceof Object) {
    
    
          flatten(itemValue, itemKey);
        } else if (itemValue === null || itemValue === undefined) {
    
    
        } else {
    
    
          if (key) {
    
    
            result[`${
      
      key}.${
      
      itemKey}`] = flatten(itemValue, itemKey);
          } else {
    
    
            result[itemKey] = flatten(itemValue, itemKey);
          }
        }
      }
    } else {
    
    
      return params;
    }
  };
  flatten(input);
  return result;
}
let input = {
    
    
  a: 1,
  b: [
    1,
    2,
    {
    
    
      c: true,
    },
    [3],
  ],
  d: {
    
    
    e: 2,
    f: 3,
  },
  g: null,
};
copy(input);

数组差集

let subSet = function (arr1, arr2) {
    
    
  var set1 = new Set(arr1);
  var set2 = new Set(arr2);

  var subset = [];

  for (let item of set1) {
    
    
    if (!set2.has(item)) {
    
    
      subset.push(item);
    }
  }

  return subset;
};

字符串解码

function decodeString(input) {
    
    
  let i1 = input.lastIndexOf("[");
  let i2 = input.indexOf("]", i1);
  if (i1 > -1 && i2 > -1) {
    
    
    let oldStr = input.substring(i1, i2 + 1);
    let number = "";
    for (let i = i1 - 1, j = 0; ; i--, j++) {
    
    
      if (input[i]) {
    
    
        if (!(input[i] >= 0)) {
    
    
          break;
        } else {
    
    
          number = input[i] + number;
        }
      }else{
    
    
          break;
      }
    }
    function change(str, num) {
    
    
      let newStr = "";
      for (let i = 0; i < num; i++) {
    
    
        newStr += str;
      }
      return newStr;
    }
    input = input.replace(number + oldStr, change(oldStr.slice(1, -1), number));
    return decodeString(input);
  } else {
    
    
    return input;
  }
}
let str = '2[3[a]2[bc]]'

猜你喜欢

转载自blog.csdn.net/qq_40289624/article/details/111904148