在对象中设置深层嵌套属性时是否适合使用eval?

时间:2014-10-02 16:36:40

标签: javascript

我正在编写一个函数,它将接收一个对象并修改对象中的一个字段(可能是一个嵌套字段)。例如,modifyObj(obj,' nested.nested',2)将基本上执行obj.nested.nested = 2.最简单的方法似乎是使用eval,但是共识似乎是使用eval是邪恶的? http://jsfiddle.net/zntf6bfw/

function modifyObj(obj, field, val) {
    var str = 'obj.' + field + '=' + val;
    eval(str);
}

另一种方法是使用正则表达式来确定传入的字段是否嵌套,如果是,则使用循环来获取嵌套对象并对其进行修改(这将修改整个对象)。但是,这似乎不必要地复杂化,并且这将被视为eval的有效用例吗?

function modifyObj2(obj, field, val) {
    //if we are modifying a nested val
    if (/\./g.test(field)) {
        var arr = field.split('.'),
            temp = obj;
        //we want temp to be equal to the nested object holding the nested field to be modified and changing this will modify the passed in object
        for (var i = 0; i < arr.length - 1; i++) {
            temp = temp[arr[i]];
        }
        temp[arr.length - 1] = val;
    } 
    //if we are modifying a non-nested val
    else {
        obj[field] = val;
    };
}

2 个答案:

答案 0 :(得分:1)

  

在对象中设置深层嵌套属性时是否适合使用eval?

没有

它打开脚本以编码可能变成安全漏洞的错误。

真正的问题是你遇到的问题会让你相信eval是一个合理的解决方案。请考虑以下代码:

Vanilla JS:
obj.foo.bar.baz.fizz.buzz = val;
你的modifyObj函数:
modifyObj(obj, 'foo.bar.baz.fizz.buzz', val);

其中一个简洁,易于阅读,易于调试,易于理解,运行速度非常快。另一个是你的modifyObj功能。

答案 1 :(得分:0)

使用eval基本上总是可以避免的。

对于像这样的简单赋值(一个嵌套),只需使用一个简单的方法

function modifyObj(obj, field, val) {
 obj[field] = val;
}

如果字段实际上是&#34; prop [3] .person.name&#34;那么你将要使用正则表达式方法或对象展平方法,如

function flatten(obj){
 var root = {};
 (function tree(obj, index){
   var suffix = toString.call(obj) == "[object Array]" ? "]" : "";
   for(var key in obj){
    if(!obj.hasOwnProperty(key))continue;
    root[index+key+suffix] = obj[key];
    if( toString.call(obj[key]) == "[object Array]" )tree(obj[key],index+key+suffix+"[");
    if( toString.call(obj[key]) == "[object Object]" )tree(obj[key],index+key+suffix+".");   
   }
 })(obj,"");
 return root;
}

允许使用复杂的字符串。更多相关内容:https://stackoverflow.com/a/25370536/1026459