我有一些看起来像这样的代码:
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 profiler声称第二个最长的函数是eval(),占运行时间的近6%.
每个人都说eval是EVIL(就像糟糕的那样)而且很慢(正如我所发现的那样),但我真的无法做任何事情 - 服务器只是将数据从数据库中拉出来并推送到浏览器.
我有什么替代品?我可以像在服务器上做的那样做,但这只会将负担转移到链条上方.我无法更改数据库布局,因为所有内容都挂钩到这8个变量,这是一项艰巨的任务.
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 ...
上面的行.
您只是从函数8参数创建一个数组,删除小于或等于零的数组.
以下代码是等效的,它适用于任意数量的参数:
function StrippedExample() { var args = []; for (var i = 0; i < arguments.length; i++) { if (arguments[i] > 0) { args.push(arguments[i]); } } //... }
使用一个参数调用该函数 - 一个数组
使用arguments对象