gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 01:46:32 25 4
gpt4 key购买 nike

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

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% 的运行时间。

Everyone says eval is EVIL (糟糕)和缓慢(正如我发现的那样),但我真的不能做任何其他事情 - 服务器只是将数据从数据库中拉出并推送到浏览器。

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

最佳答案

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 ... 行。

关于javascript - JavaScript 中 eval 的替代方案是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2029888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com