Reputation: 5
So I try build my own Javascript calculator as an exercise. Unfortunately when I try to use the eval()
function with "=" button click to convert string into result, for example "2+2*2", nothing happens. Here's my code:
var draw = document.getElementById("result");
function calc(x) {
draw.innerHTML += x;
if (x === '=') {
draw.innerHTML = eval(draw.innerHTML);
} else if (x === 'c') {
draw.innerHTML = '0';
} else if (x === 'sqrt') {
draw.innerHTML = Math.sqrt(eval(draw.innerHTML));
} else if (x === 'pow') {
draw.innerHTML = Math.pow(eval(draw.innerHTML));
}
}
Upvotes: 0
Views: 389
Reputation: 138497
draw.innerHTML += x;
means if e.g. your string is 2*2
and you call
calc("sqrt")
the draws content will be
"2*2sqrt"
and thats not a valid expression, therefore the eval
will fail. You may want to only concat if its not an operation:
function calc(x) {
if (x === '=') {
return draw.innerHTML = eval(draw.innerHTML);
} else if (x === 'c') {
return draw.innerHTML = '0';
} else if (x === 'sqrt') {
return draw.innerHTML = Math.sqrt(eval(draw.innerHTML));
} else if (x === 'pow') {
return draw.innerHTML = Math.pow(eval(draw.innerHTML),2);
}
draw.innerHTML += x;
}
That can be beautified with an object as a lookup table:
const result = n => eval(n),
sqrt = n => Math.sqrt(eval(n)),
pow = n => Math.pow(eval(n),2),
default = (n, add) => n + add;
function calc(in){
draw.innerHTML = ({"=":result, sqrt, pow}[in] || default)(draw.innerHTML, in);
}
Upvotes: 1