手写实现 JSON.parse
eval 实现
需要在左右添加括号,才能获得值。否则语法报错
const a = eval("(" + JSON.stringify({a:1})+")")
手写
function myParse(jsonStr) { let index = 0 function parseValue() { let ch = jsonStr[index] const strategies = { '{': parseObject, '[': parseArr, 't': parseTrue, 'f': parseFalse, 'n': parseNull, '"': parseString, } console.log('---', ch) const fn = strategies[ch] return fn ? fn() : parseNumber() } function parseObject() { let obj = {} index++ while (jsonStr[index] !== '}') { let key = parseString() index++ let value = parseValue() obj[key] = value if (jsonStr[index] === ',') { index++ } } index++ return obj } function parseArr() { let arr = [] index++ while (jsonStr[index] !== ']') { let value = parseValue() arr.push(value) if (jsonStr[index] === ',') { index++ } } index++ return arr } function parseString() { // "asdf" let str = '' index++ while (jsonStr[index] !== '"') { str += jsonStr[index] index++ } index++ return str } function parseNull() { index += 'null'.length return null } function parseTrue() { index += 'true'.length return true } function parseFalse() { index += 'false'.length return false } function parseNumber() { let numStr = '' let ch = jsonStr[index] while (isDigit(ch) || ch === '.' || ch === "e" || ch === 'E' || ch === '+' || ch === '-') { numStr += ch index++ ch = jsonStr[index] } return parseFloat(numStr) } function isDigit(ch) { return ch >= '0' && ch <= '9' } return parseValue() } myParse(JSON.stringify({ foo: 'bar', test: [1, 2, {}], c: true, d: false, e: null, f: 1234 }))
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论