What are the Alternatives to eval in JavaScript?
Solution 1:
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;
}
}
}
The above code can be simplified further, I just made the minimal change to get rid of eval
. You can get rid of j
, for example:
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); }
}
}
is equivalent. Or, to use the built-in arguments
object (to avoid having your parameter list in two places):
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); }
}
}
Even if you weren't filtering the list, you don't want to do something like this.i = arguments
because arguments
is not a real Array; it has a callee
property that you don't need and is missing some array methods that you might need in i
. As others have pointed out, if you want to quickly convert the arguments
object into an array, you can do so with this expression:
Array.prototype.slice.call(arguments)
You could use that instead of the var args = [i1, i2 ...
lines above.
Solution 2:
Eval alternative:
exp = '1 + 1'
x = Function('return ' + exp)()
console.log(x)