ЙажаСценарий / Говнокод #18097 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
function Calculation(a, b, op){
    if (typeof a == "number" && typeof (b) == "number"){
        var result;
        +a; +b;
        if (op == "+")  { result = a+b; alert(result);
        } else if (op == "-") { result = a-b; alert(result);
        } else if (op == "*"){ result = a*b; alert(result);
        } else if (op == "/"){
            if (b!=0){ 
                result = a/b; alert(result);
            } else {
                alert("Can`t divide on zero!");
            }
        }
    } else if (a instanceof Array && b instanceof Array) {
        var result = [];
        if ( a.length >= b.length ){
            length = a.length;
            for (var i=0; i < length; i++){
                a[i] = parseFloat(a[i]);
                b[i] = parseFloat(b[i]);
                if (i < b.length-1){
                    if (op == "+"){ result[i] = a[i]+b[i];
                    } else if (op == "-"){ result[i] = a[i]-b[i];
                    } else if (op == "*"){ result[i] = a[i]*b[i];
                    } else if (op == "/"){
                        if (b[i]!=0){
                            result[i] = a[i]/b[i];
                        } else {
                            alert("Can`t divide on zero!");
                        }
                    }
                } else {
                    result[i] = a[i];
                }
            } 
            alert(result.join("  |  "));
        } else {
            length = b.length;
            for (var i=0; i < length; i++){
                +a[i]; +b[i];
                if (i < a.length-1){
                    switch (op){
                        case "+":
                            result[i] = a[i]+b[i];
                            break;
                        case "-":
                            result[i] = a[i]+b[i];
                            break;
                        case "*":
                            result[i] = a[i]+b[i];
                            break;
                        case "/":
                            if (b[i]!=0){
                                result[i] = a[i]/b[i];
                            } else {
                                alert("Can`t divide on zero!");
                            }
                            break;
                    }
                } else {
                    result[i] = a[i];
                }
            } 
            alert(result.join("  |  "));
        }
    } else if (a instanceof Object && b instanceof Object) {
        var tempObject = {};
            switch (op){
                case "+":
                    tempObject.resultA = a.a+b.a;
                    tempObject.resultB = a.b+b.b;
                    break;
                case "-":
                    tempObject.resultA = a.a+b.a;
                    tempObject.resultB = a.b+b.b;
                    break;
                case "*":
                    tempObject.resultA = a.a+b.a;
                    tempObject.resultB = a.b+b.b;
                    break;
                case "/":
                    if (b.b !=0 || b.a != 0){
                        tempObject.resultA = a.a+b.a;
                        tempObject.resultB = a.b+b.b;
                    } else {
                        alert("Can`t divide on zero!");
                    }
                    break;
            }
            
            alert(tempObject.resultA + " " + tempObject.resultB);
    }
}

Вот такой вот калькулятор!

Запостил: alexhelkar alexhelkar, (Updated )

Комментарии (10) RSS

      • Если не приводить тип, можно наткнуться на какую-нибудь весёлую особенность.
        Скажем, "2"*"2" будет 4, а "2"+"2" -- "22". Какой-нибудь Math.exp преобразует строку к числу сам, а пользовательская функция может и набедокурить.
        Ответить
    • Ага. Результат которого выбросили на помойку. А в переменной как была строка, так и осталась. Если уж приводить подобными способами - то как-то так:
      a = +a;
      a -= 0;
      Ответить
      • >Ага. Результат которого выбросили на помойку. \
        Ничего, всегда есть тот кто с помойки этот мусор подберёт. И я говорю конечно же о gc.
        Ответить
  • Кстати, безумное +a; +b; можно действительно использовать как assert для пользовательских значений:
    function StrictValue(v) {
      this.value = v;
    }
    
    StrictValue.prototype.valueOf = function(){
      if(typeof this.value === 'object')
        throw new Error(':(');
      return +this.value;
    };
    
    var a = new StrictValue(2);
    var b = new StrictValue({});
    
    +a;
    console.log('lol'); // lol
    +b; // Error: :(
    console.log('lol');
    Ответить
    • Хм. Это довольно стандартный трюк, переопределять/удалять valueOf/toString чтоб добиться хоть какой-то типабезопастности.
      Ответить
      • Я хотел сделать упор на императивность происходящего.
        Как возможный вариант рассматривал что-то такое:
        function Killer(kill) {
          this.kill = Boolean(kill);
        }
        Killer.prototype.valueOf = function(){
          if(this.kill) throw new Error;
        };
        var a = new Killer(false), b = new Killer(true);
        +a; +b;

        Но так и не придумал, как такое может пригодиться, отчего пришёл к предварительной проверке.

        Наверно надо как-то так:
        // Императивный питух
        function Assert(expr) {
          this.expr = expr;
        }
        Assert.prototype.valueOf = function() {
          if(!this.expr()) throw new Error;
        }

        // пример использования
        var OK = [true];
        var assertOK = new Assert(function(){ return OK[0] === true; });
        
        function maybeSqrt(x, res) {
          if(x < 0) {
            res[0] = false;
            return;
          }
          res[0] = true;
          return Math.sqrt(x);
        }
        
        +assertOK;
        var s = 0;
        for(var i=0; i<10; ++i) {
          var x = Math.random() - 0.3;
          var y = maybeSqrt(x, OK);
          +assertOK;
          s += y;
          console.log(x, y, s);
        }
        console.log('S = ' + s);
        Ответить

Добавить комментарий

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8