2020-12-03 JS- new Function

原题:写一个函数判定给定的对象的指定层级是否为空

调用方式:getExsitedObjectKey(result, 'a.b.c');
说明: 判定result.a.b.c 的值,不是空就返回true,是其他任何类型都返回false

解:

​ 这个题最有意思的是第二个参数给的是字符串,表示的是层级,那么这里解题就可以有两个大的思路,分别是对象的取用方式: abc['a'] 和 abc.a; 之后拿着取值进行类型判定即可;

那么解题开始。。。

解题方式一 abc.c,直接贴代码(核心代码):

function queryValue(result, str) {
    if (typeof str !== 'string' && !result) {
        return false;
    }
    // 由于中间层可能不存在,避免程序执行失败
    try {
        let _resultFun = 'return result.' + str;
        let _fun = new Function('result', _resultFun);
        return _fun(result);
        // return eval('result.' + str);
    } catch (error) {
        return false;
    }
}
let abc = {
    a: { b: { c: 1 }}
};
console.log('>>>', queryValue(abc, 'a.b.c'));

解题方式二 abc['a'],直接贴代码

function queryValue(result, str) {
    if (typeof str !== 'string' && !result) {
        return false;
    }
    let arr = str.split('.');
    let keyVal = false;
    // 避免取值失败
    try {
        keyVal = arr.reduce((obj, item) => {
            return obj[item];
        }, result);
    } catch (error) {
        keyVal = false;
        console.info('error', error);
    }
    return keyVal;
}
let abc = {
    a: { b: { c: 1 }}
};
console.log('>>>', queryValue(abc, 'a.b.c'));

总结:

1、new Function();传参数进行执行,算是用的比较少;用用,别手生了;

eval() 但是除了是自身的使用,否则直接用其他地方拿来的字符串可能会造成项目内部的数据泄露;建议这两种方式放入函数内部使用,不对外暴露;

2、第二种方式的循环,可以用更多的方式实现,这种叠加的方式还是有意思;

你可能感兴趣的:(2020-12-03 JS- new Function)