1.JS中只有加法会起到拼接字符串的效果,其它的减乘除会自动将字符串转为数字,为避免加法出错可以如下:
var result = +'20' + +'5';//单独一个加号表示取正,会自动转为数字
2.OCP原则-开放与封闭原则
添加功能开放,修改代码封闭
switch往往是代码糟糕的开始,当大量使用时会让代码不容易修改、不容易扩展
ar operation={
add:function(num1,num2){
return +num1 + +num2;
},
subtract:function(num1,num2){
return num1 - num2;
},
multiply:function(num1,num2){
return num1 * num2;
},
divide:function(num1,num2){
return num1 / num2;
},
addOperation:function(name,fn){//增加功能的接口,二次开发人员可以通过接口直接增加新功能,避免修改原始代码产生错误
if(!this[name]){
this[name] = fn;
}
return this;//方便链式调用
}
};
function operate(name){//不明确指定参数个数,使用arguments
if(!operation[name])throw new Error('不存在名为'+name+'的方法');
return operation[name].apply(operation,[].slice.call(arguments,1,arguments.length));
}
operation.addOperation('mod',function(num1,num2){
return num1%num2;
}).addOperation('power',function(base,power){
return Math.pow(base,power);
}); //链式调用增加方法
each(calculatorElem.btns,function(index,elem){
elem.onclick=function(){
updateSign(this.value);
outputResult(operate(this.title,calculatorElem.formerInput.value,calculatorElem.laterInput.value));//用一行代码替换switch
}
})
call与apply能够通过第一个参数改变this的指向,使arguments(或其它)借用数组(引用类型)的方法
[].silce.call(arguments,1,arguments.length);
{}.silce.toString(arguments);
3.模块化
以上程序的operate和operation都是用来接收参数并进行计算,可以将其放入函数作用域,并采取匿名函数自执行的方式编写,封闭内部代码,只往外暴露接口以供使用
var operate=(function(){//此operate为全局变量,作为接口提供使用,函数内部对使用者不可见
var operation={
add:function(num1,num2){
return +num1 + +num2;
},
subtract:function(num1,num2){
return num1 - num2;
},
multiply:function(num1,num2){
return num1 * num2;
},
divide:function(num1,num2){
return num1 / num2;
},
addOperation:function(name,fn){//增加功能的接口,二次开发人员可以通过接口直接增加新功能,避免修改原始代码产生错误
if(!operation[name]){
operation[name] = fn;
}
return operation;//避免使用this造成指向错误
}
};
function operate(name,num1,num2){
if(!operation[name])throw new Error('不存在名为'+name+'的方法');
return operation[name].apply(operation,[].slice.call(arguments,1,arguments.length));
}
operate.addOperation=operation.addOperation;//将添加方法传递给接口
return operate;//将函数作为返回值
})();
operate.addOperation('mod',function(num1,num2){
return num1%num2;
}).addOperation('power',function(base,power){
return Math.pow(base,power);
});
4.修改及建议
1)输入值的合法性验证 isNaN();
2)JS对小数的计算有缺陷,可以尝试先变为整数计算结果再变为小数
先判断是否为浮点数
var re = /^-?\d+$/;//用于判断是否是整数
var n = 56.1;
re.test(n);//返回false
再取得小数位数
<script>
var n=3.143423423;
alert(n.toString().split(".")[1].length); //先转为字符串,再分割为数组,取得小数点后部分的长度
</script>
具体程序写法有待研究
3)运算符号可以与键盘结合 keydown-event.keyCode;
4)绑定事件可以使用监听事件代理 addEventListener(event,fn);
补充:
<select id='operate'>
<option value='add'>+</option>
<option value="subtract">-</option>
<option value="multiply">*</option>
<option value="divide">/</option>
</select>
通过select标签只能获得option的value值,所以操作都应该基于value
<input type='text' id='num2' />
文本输入框中输入的值,同样通过value传输