【前端面试小册】第6节-实现JOSN.Parse

148 阅读1分钟

1、Funtion来实现

function myJsonParse(data) {
    return new Function(`return${data}`)()
}

const arr = JSON.stringify([124]);
console.log(myJsonParse(arr)); // [1, 2, 4]

const test = {
    name'成都巴菲特',
};
const newTest = JSON.stringify(test);
console.log(myJsonParse(newTest)); // {name: "成都巴菲特"}

2、eval实现

  • 普通实现
function myJsonParse(opt) {
    return eval(`(${opt})`);
}

const arr = JSON.stringify([124]);
console.log(myJsonParse(arr)); // [1, 2, 4]

const test = {
    name'成都巴菲特',
};
const newTest = JSON.stringify(test);
console.log(myJsonParse(newTest)); // {name: "成都巴菲特"}

用eval,如果被解析的不是json对象而是一段带有攻击的js代码,那么就会导致xss漏洞;

  • 过滤xss攻击实现
function myJsonParse(data) {
    const r1 = /^[],:{}\s]*$/;
    const r2 = /\(?:["\/bfnrt]|u[0-9a-fA-F]{4})/g;
    const r3 = /"[^"\\n\r]*"|true|false|null|-?\d+(?:.\d*)?(?:[eE][+-]?\d+)?/g;
    const r4 = /(?:^|:|,)(?:\s*[)+/g;
    // 是否是合法的JSON
    const isLegal = r1.test(
        data
            .replace(r2, '@')
            .replace(r3, ']')
            .replace(r4, ''),
    );
    if (isLegal) {
        return eval(`(${data})`);
    }
    throw new TypeError('请传入合法的JSON');
}

3、查看更多

文章,首发地址,查看面试小册更多内容