题解 | #简易计算器#运算逻辑详解

简易计算器

http://www.nowcoder.com/practice/8237298fd1354cdaabd04796280cc90e


var Calculator = {
    init: function () {
        var that = this;
        if (!that.isInited) {
            that.isInited = true;
            // 保存操作信息
            // total: Number, 总的结果
            // next: String, 下一个和 total 进行运算的数据
            // action: String, 操作符号
            that.data = {total: 0, next: '', action: ''};
            that.bindEvent();
        }
    },
    bindEvent: function () {
        var that = this;
        // 请补充代码:获取 .cal-keyboard 元素
        var keyboardEl = document.querySelector(".cal-keyboard");
        keyboardEl && keyboardEl.addEventListener('click', function (event) {
            // 请补充代码:获取当前点击的dom元素
            var target = event.target;
            // 请补充代码:获取target的 data-action 值
            // var action = target.dataset.action;
            var action = target.getAttribute("data-action");
            // 请补充代码:获取target的内容
            var value = target.innerHTML;
            
            if (action === 'num' || action === 'operator') {
                that.result(value, action === 'num');
            }
        });
    },
    result: function (action, isNum) {
        var that = this;
        var data = that.data;
        console.log(action);
        console.log(data);

        /*
            情况1:按的是数字   (isNum)
                    考虑前一个(data.next)是不是也是数字呀~~是的话就拼接
                    是第一个数字噢~total要变为0啦!
            情况2:按清空      (action === '清空')
                    data为初始化状态
            情况3:按等于符号   (action === '=')
                    运算后 data.next data.action都清空
            情况4:连续按+-x÷符号   (!data.next)
                    去最后一个符号 data.action=action
            情况5:连续运算 没有按等号 例如2x3+6+3   (data.action)
                    运算后,清空data.next data.action等于下一个运算符
            清空6: 第一次运算和按了等于符号后的第一次运算    
                    data.total等于0或者是上一次等于号后的遗产
                    data.next清空 data.action等于当前运算符

        */
        if (isNum) {  //如果是数字的话
            //如果data.next是空的话 data.next就等于当前按的数字
            //否则不为空就说明连续按了好几次数字,等于字符拼接,例如6 2 2=> 622
            data.next = data.next === '0' ? action : (data.next + action);
            //在操作符不存在的情况下 例如在=符号过后,结果输出来,又重新按了一个数字,total就等于0 重头开始
            !data.action && (data.total = 0); //data.action(操作符号)='',data.total还是0
        } else if (action === '清空') {   //是清空操作
            // 请补充代码:设置清空时的对应状态  
            data.total = 0;
            data.next = '';
            data.action = '';
        } else if (action === '=') {   //是等于符号 
            if (data.next || data.action) {   //data.next 和data.action 至少要有一个不为空
                data.total = that.calculate(data.total, data.next, data.action);
                data.next = '';
                data.action = '';
            }
        } else if (!data.next) {   //dara.next(上一个数)是空的 //连续按操作符的情况 +++---
            console.log("什么时候操作这里呀"); 
            data.action = action;  //那就收集操作符  
        } else if (data.action) {   //如果data.action还有的话  例如2x3+6+3类似情况
            data.total = that.calculate(data.total, data.next, data.action);  //把上一个计算了放进total
            data.next = '';
            data.action = action;     //等于这个操作符
        } else {           //data.next(上一个数)有数字,data.action却为空 (就是在等于符号后的情况)
            console.log("什么时候是兜底?");     
            data.total = +data.next || 0;   //tatal要不就为data.next,要不就变成0(第一次运算)
            data.next = '';
            data.action = action;
        }
    
        // 补充代码:获取 .origin-value 元素
        var valEl = document.querySelector(".origin-value");
        valEl && (valEl.innerHTML = data.next || data.total || '0');
    },
    calculate: function (n1, n2, operator) {    
        n1 = +n1 || 0;  //+号是的n1转number类型  //由于n1 n2 都有可能是空值 所以如果+n1为不存在 那么n1=0
        n2 = +n2 || 0;
        if (operator === '÷') {
            // 请补充代码:获取除法的结果
            return n2===0?0:Math.floor((n1/n2)*100)/100;
        } else if (operator === 'x') {
            // 请补充代码:获取乘法的结果
            return Math.floor((n1*n2)*100)/100;
        } else if (operator === '+') {
            // 请补充代码:获取加法的结果
            return Math.floor((n1+n2)*100)/100;
        } else if (operator === '-') {
            // 请补充代码:获取减法的结果
            return Math.floor((n1-n2)*100)/100;
        }
    }
};
Calculator.init();

测试代码

function test() {     
  Calculator.init();     
  Calculator.result('清空');     
  var n = Calculator.calculate(0.2, 0.4, '+');     
  var result = !!(n === 0.6);     
  return result; 
}
// console.log(test());
全部评论

相关推荐

头像
11-06 10:58
已编辑
门头沟学院 嵌入式工程师
双非25想找富婆不想打工:哦,这该死的伦敦腔,我敢打赌,你简直是个天才,如果我有offer的话,我一定用offer狠狠的打在你的脸上
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务