简易计算器项目

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传输

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值