JavaScript 中 eval 的替代方案是什么?

新手上路,请多包涵

我有一些看起来像这样的代码:

 function StrippedExample(i1, i2, i3, i4, i5, i6, i7, i8) {
    this.i = [];
    for (var i=1,j=0 ;i<9;i++) {
        var k = eval("i"+i);
        if (k > 0) {
            this.i[j++] = k;
        }
    }
}

FireBug 分析器声称第二长的函数是 eval(),占用了将近 6% 的运行时间。

每个人都说 eval 是 EVIL (坏)和慢(正如我所发现的),但我真的无能为力 - 服务器只是将数据从数据库中拉出并推送到浏览器。

我有什么选择? 我可以在服务器上做同样的事情,但这只会将负担转移到更高的链条上。我无法更改数据库布局,因为所有内容都与这 8 个变量挂钩并且是一项艰巨的任务。

原文由 graham.reeds 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答
function StrippedExample(i1, i2, i3, i4, i5, i6, i7, i8) {
    var args = [i1, i2, i3, i4, i5, i6, i7, i8]; // put values in an array
    this.i = [];
    for (var i=0,j=0 ;i<8;i++) { // now i goes from 0-7 also
        var k = args[i]; // get values out
        if (k > 0) {
            this.i[j++] = k;
        }
    }
}

上面的代码可以进一步简化,我只是做了最小的改动来去掉 eval 。您可以摆脱 j ,例如:

 function StrippedExample(i1, i2, i3, i4, i5, i6, i7, i8) {
    var args = [i1, i2, i3, i4, i5, i6, i7, i8];
    this.i = [];
    for (var i = 0; i < args.length; i++) {
        var k = args[i];
        if (k > 0) { this.i.push(k); }
    }
}

是等价的。或者,使用内置的 arguments 对象(避免在两个地方有你的参数列表):

 function StrippedExample(i1, i2, i3, i4, i5, i6, i7, i8) {
    this.i = [];
    for (var i = 1; i < arguments.length; i++) {
        var k = arguments[i];
        if (k > 0) { this.i.push(k); }
    }
}

即使你没有过滤列表,你也不想做类似 this.i = arguments 的事情,因为 arguments 不是真正的数组;它有一个您不需要的 callee 属性,并且缺少一些您可能需要的数组方法 i 。正如其他人指出的那样,如果您想快速将 arguments 对象转换为数组,可以使用以下表达式:

 Array.prototype.slice.call(arguments)

您可以使用它来代替上面的 var args = [i1, i2 ... 行。

原文由 benzado 发布,翻译遵循 CC BY-SA 2.5 许可协议

评估替代方案:

 exp = '1 + 1'
x = Function('return ' + exp)()
console.log(x)

原文由 Arthur Ronconi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题