我有一些看起来像这样的代码:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
FireBug profiler声称第二个最长的函数是eval(),占运行时间的近6%.
每个人都说eval是EVIL(就像糟糕的那样)而且很慢(正如我所发现的那样),但我真的无法做任何事情 - 服务器只是将数据从数据库中拉出来并推送到浏览器.
我有什么替代品?我可以像在服务器上做的那样做,但这只会将负担转移到链条上方.我无法更改数据库布局,因为所有内容都挂钩到这8个变量,这是一项艰巨的任务.
ben*_*ado 15
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码可以进一步简化,我只是做了最小的改变来摆脱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); }
}
}
Run Code Online (Sandbox Code Playgroud)
是等价的.或者,使用内置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); }
}
}
Run Code Online (Sandbox Code Playgroud)
即使你没有过滤列表,你也不想做某些事情,this.i = arguments因为arguments它不是真正的数组; 它有一个callee你不需要的属性,并且缺少一些你可能需要的数组方法i.正如其他人所指出的,如果你想快速将arguments对象转换为数组,你可以使用这个表达式:
Array.prototype.slice.call(arguments)
Run Code Online (Sandbox Code Playgroud)
您可以使用它而不是var args = [i1, i2 ...上面的行.
评估替代方案:
exp = '1 + 1'
x = Function('return ' + exp)()
console.log(x)
Run Code Online (Sandbox Code Playgroud)
您只是从函数8参数创建一个数组,删除小于或等于零的数组.
以下代码是等效的,它适用于任意数量的参数:
function StrippedExample() {
var args = [];
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] > 0) {
args.push(arguments[i]);
}
}
//...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13623 次 |
| 最近记录: |