Sunny-117 / js-challenges

✨✨✨ Challenge your JavaScript programming limits step by step

Home Page:https://juejin.cn/column/7244788137410560055

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

JSON.parse

Sunny-117 opened this issue · comments

// eval 实现
var json = '{"a":"1", "b":2}';
var obj = eval("(" + json + ")");  // obj 就是 json 反序列化之后得到的对象
// New Function
var json = '{"name":"小姐姐", "age":20}';
var obj = (new Function('return ' + json))();
function parseJSON(jsonStr) {
  let index = 0;
  const getNextToken = () => jsonStr[index++];
  const parseValue = () => {
    const token = getNextToken();
    if (token === '{') {
      return parseObject();
    } else if (token === '[') {
      return parseArray();
    } else if (token === '"') {
      return parseString();
    } else if (token === 't') {
      return true;
    } else if (token === 'f') {
      return false;
    } else if (token === 'n') {
      return null;
    } else if (!isNaN(token) || token === '-') {
      return parseNumber(token);
    } else {
      throw new SyntaxError('Unexpected token: ' + token);
    }
  };
  const parseObject = () => {
    const obj = {};
    let key = parseString();
    while (getNextToken() !== '}') {
      obj[key] = parseValue();
      if (jsonStr[index] === ',') {
        index++;
        key = parseString();
      }
    }
    return obj;
  };
  const parseArray = () => {
    const arr = [];
    let token = getNextToken();
    while (token !== ']') {
      index--;
      arr.push(parseValue());
      token = getNextToken();
      if (token === ',') {
        token = getNextToken();
      }
    }
    return arr;
  };
  const parseString = () => {
    let str = '';
    let char = getNextToken();
    while (char !== '"') {
      str += char;
      char = getNextToken();
    }
    return str;
  };
  const parseNumber = (token) => {
    let numStr = token;
    while (!isNaN(jsonStr[index]) || jsonStr[index] === '.') {
      numStr += getNextToken();
    }
    return Number(numStr);
  };
  return parseValue();
}
JSON.myParse = function (str) {
    //实现一
    // let a
    // eval('a=' + str)
    // return a

    //实现二
    // return new Function(`return ${str}`)()

    //实现三
    // window._res = null;
    // const dom = document.createElement("script");
    // dom.innerHTML = `window._res=${str}`;
    // document.body.appendChild(dom);
    // return window._res;
};