我正在制作一个计算器并按下/保存所有数字和操作符,点击一个数组和一个字符串.
我想知道在这种情况下哪种方法最好.从输入中创建一个字符串或数组或者是一个我无法想到的更好的方法.
我想计算数组或字符串.字符串给出了错误的答案,我不知道如何计算数组.演示计算器如下.
$(document).ready(function(){
var inputArr = [];
var inputStr = '';
$('span').click(function(){
$('#input').append($(this).text());
//push to inputArr
inputArr.push($(this).text());
//add to inputStr
inputStr += $(this).text();
});
//Get result
$('.equals').click(function(){
$('#result').text(inputArr);
$('#result').append("<br/>" + parseInt(inputStr));
});
$('.clear').click(function(){
// clear everything
$('#input').text('');
inputArr = [];
inputStr = '';
});
});
span {
background: #bbb;
border-radius: 2px;
margin: 5px;
padding: .5em;
cursor: pointer;
}
.equals{
width: 30%;
background: #bbb;
border-radius: 2px;
margin: 15px;
padding: .5em;
cursor: pointer;
text-align: center;
font-size: 1.5em;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span>1</span> <span>2</span> <span>3</span> <span>4</span> <span>5</span>
<br/>
<br/>
<span>6</span> <span>7</span> <span>8</span> <span>9</span> <span>0</span>
<br/><br/>
<span>+</span><span>-</span><span>*</span><span>/</span><span class='clear'>clear</span>
<p class="equals"> = </p>
<p id="input"></p>
<p id='result'></p>
我尝试使用parseInt(inputStr),但它给出了错误的答案.
解决方法:
此函数采用字符串表达式或创建表达式的字符数组.
function calculate(expression) {
"strict mode";
if (Array.isArray(expression))
expression = expression.join("");
var allowedChars = "1234567890%^*()-+/. ";
for (var i = 0; i < expression.length; i++)
if (allowedChars.indexOf(expression.charAt(i)) < 0)
throw new Error("Invalid expression: unexpected '" + expression.charAt(i) + "' in '" + expression + "'");
return eval(expression);
}
try {
alert(calculate("4+4"));
alert(calculate([7, "+", 9, "/", 34]));
alert(calculate("45/3"));
alert(calculate("100 * cheeseburger"));
} catch (e) {
alert(e.message);
}
这就是为什么这是安全的:
>不正确地使用eval会打开注射攻击代码
>在strict mode
中,eval无法向周围范围引入新变量. (因为它在它自己的功能结束时,无论如何在该范围内没有其他任何事情发生.)
>如果存在任何不属于数学表达式的字符,该函数将抛出错误,从而无法进行注入.
>使用eval,调试可能更具挑战性(没有行号等)
>在这种情况下,函数会抛出一个错误,其中包含一个行号.评估代码只是一行,所以这是不相关的.
> eval’d代码执行速度更慢(无法编译/缓存eval’d代码)
>在这种情况下,没有任何编译/缓存,所以这不是问题.