shopee一面代码题

  1. 第一道是仿JSON.parse

json_parse("[12,[[3],45,6,7],8,9]")

https://blog.51cto.com/u_11658127/3396506

直接从这简化

var json_parse = function () {
  var at = 0,      // 当前字符的索引
    ch = '';   // 当前字符
  var next = function (c) {
    // 如果提供了参数c, 那么检查它是否匹配当前字符
    if (c && c !== ch) {
      error("Expected '" + c + "' instead of '" + ch + "'");
    }
    // 获取下一个字符。当没有下一个字符时, 返回一个空字符串
    ch = text.charAt(at);
    at += 1;
    return ch;
  }
  var number = function () {
    // 解析一个数字值
    var number, string = '';

    while (ch >= '0' && ch <= '9') {
      string += ch;
      next();
    }
    number = +string;
    if (isNaN(number)) {
      console.error("Bad number");
    } else {
      return number;
    }
  }
  var white = function () {
    // 跳过空白
    while (ch && ch <= ' ') {
      next();
    }
  }
  var array = function () {
    // 解析一个数组值
    var array = [];
    if (ch === '[') {
      next('[');
      white();
      if (ch === ']') {
        next(']');
        return array; // 空数组
      }
      while (ch) {
        array.push(value());
        white();
        if (ch === ']') {
          next(']');
          return array;
        }
        next(',');
        white();
      }
    }
    error("Bad array");
  }
  var value = function () {
    // 解析一个JSON 值 它可以是对象数组、字符串、数字或一个词
    white();
    switch (ch) {

      case '[':
        return array();

      default:
        return number()
    }
  };
  return function (source, reviver) {
    var result;
    text = source;
    at = 0;
    ch = ' ';
    result = value();
    white();
    if (ch) {
      error("Syntax error");
    }
    return result
  }
}();
var res = json_parse("[12,[[3],45,6,7],8,9]")

console.log(res)

简化下:

var array_parse =  function(str){
  var at = 0
  var ch = str[0]
  var next = function(){
    at++;
    ch = str.charAt(at)
  }
  var array = function(){
    var array = []
    if(ch == '['){
      next()
       if (ch === ']') {
        next();
        return array; // 空数组
      }
      while (ch) {
        array.push(value());
        if (ch === ']') {
          next();
          return array;
        }
        next();
      }
    }
  }
  var number = function(){
    var number, string = '';
    while (ch >= '0' && ch <= '9') {
      string += ch;
      next();
    }
    number = +string;
    if (isNaN(number)) {
      console.error("Bad number");
    } else {
      return number;
    }
  }
  var value = function(){
    switch(ch){
      case '[':
        return array()
        default:
        return number();
    }
  }
  var result = value()
  return result
}

console.log(array_parse("[23,4,[7,56,[8]],6]"))
  1. 实现一个cache函数
function cache(fn){
  // TO-DO
  var res ={}
  return function(){
    var arg = arguments[0]
    console.log(arg)
    if(res[arg]){
      console.log('走的缓存')
      return res[arg]
    }else{
      res[arg] = fn.call(null,arg)
      return res[arg]
    }
    
  }
  
}

function complexCal(a){
  //这里有复杂计算
  return a
}

var combine  = cache(complexCal)

combine(1)
combine(2)
combine(1)
原文地址:https://www.cnblogs.com/johnzhu/p/15812808.html