显示数学运算语法不是结果

时间:2016-03-15 00:44:56

标签: javascript

我有一个变量var x= 12/2,我希望像12/2而不是6一样查看它。当我x.toString()String(x)时,我将结果作为字符串。有没有办法按原样获取操作,而不是原始值不是字符串时的结果?

6 个答案:

答案 0 :(得分:3)

当您实际执行如下语句时:

var x = 12 / 2;

您实际上丢失信息。丢失的信息是用于创建表达式结果的信息,即分子和分母。我们给你的最后一个结果是6

没有办法从该声明中恢复到原始表单,因为它可能是24/4594/99

如果您想保留该信息,您需要以不会丢失的方式存储值,例如创建包含分子和分母的结构/类(即理性的)。

这样,您可以获得这些值,并在您需要时随时计算结果。

周围有许多理性库,但您可能希望找到一个可以选择不对数字进行规范化的选项,例如将7/21转换为1/3

或者你可以选择一些非常简单的东西,例如:

"use strict";

class Rational {
    constructor(pnum, pden) {
        this.num = pnum;
        this.den = pden;
    }
    expr() {
        return "(" + this.num + "/" + this.den + ")";
    }
    result() {
        if (this.den === 0) {
            if (this.num === 0) {
                return "undefined";
            }
            return "infinite";
        }
        return this.num / this.den;
    }
}

var ratnum = new Rational(6, 4);
console.log(ratnum.expr());
console.log(ratnum.result());

那是使用基于ES6类的语法糖。如果您更喜欢旧款式,也可以这样做:

function Rational(pnum, pden) {
    this.num = pnum;
    this.den = pden;
};
Rational.prototype = {
    expr: function() {
        return "(" + this.num + "/" + this.den + ")";
    },
    result: function() {
        if (this.den === 0) {
            if (this.num === 0) {
                return "undefined";
            }
            return "infinite";
        }
        return this.num / this.den;
    }
};

var ratnum = new Rational(6, 4);
console.log(ratnum.expr());
console.log(ratnum.result());

在这两种情况下,您都会以两种不同的方式看到输出:

(6/4)
1.5

答案 1 :(得分:2)

  

有没有办法按原样获取操作,而不是原始值不是字符串时的结果?

不,因为12/2是一个在赋值发生之前得到评估的表达式。你不能反向工程"来自结果的原始表达。

答案 2 :(得分:2)

只要您致电var x = 12/2,变量x就会设置为值6。

如果您希望能够同时显示' 12/2'和计算出的值,你可以将你的表达式存储为一个字符串,并使用eval()(使用它时要非常小心)来获取表达式的计算值。

但你可以这样做:

var x = '12/2';
console.log(x); >> Outputs '12/2'
console.log(eval(x)); >> outputs 6

正如其他许多人所说的那样,eval()永远不应该用在不直接来自你的字符串上,因为它可以打开你的网站以防止安全漏洞。

来自MDN:

  

eval()是一个危险的函数,它执行它以调用者的特权传递的代码。如果您使用可能受恶意方影响的字符串运行eval(),您最终可能会使用您的网页/扩展程序的权限在用户的计算机上运行恶意代码。更重要的是,第三方代码可以看到调用eval()的范围,这可能会导致类似函数不易受影响的攻击。<​​/ p>      

eval()通常也比替代品慢,因为它必须调用JS解释器,而许多其他构造由现代JS引擎优化。

     

对于常见用例,eval()有更安全(更快!)的替代方案。

答案 3 :(得分:1)

当您编写如下表达式时:

 var x = 12 / 2;

您正在编写一个需要评估的表达式所以,这就是JS引擎所做的。

我可以想到一种方式,坦率地说,我很犹豫地告诉你,因为它被认为是你在JS中可以做的最糟糕的事情之一(更多要关注):

      var expression = "12 / 2";

      var result = eval(expression);

      alert(expression + " produces " + result);

  

现在,这可能会做你想要的,但eval()已知为 EVIL ,因为   它将评估您传递给它的任何字符串,并且可以打开   应用程序中的安全漏洞。此外,eval()带来任何   它在当前范围内找到的声明,可以消除   你指望的变量。

这是否符合您的要求?是。你应该这样做吗?不!

答案 4 :(得分:1)

请勿这样做:

  1. 假设这个JS在<script>元素中运行
  2. 使用currentScript获取该元素
  3. 使用text获取源代码
  4. 不知何故,解析它直到找到你的变量。在下面的例子中,我使用了regexp 请注意JS不是常规语言,因此无法通过regexp正确解析。
  5. 获取分配给变量的表达式。
  6. var x = 12 / 2;
    
    var source = document.currentScript.text;
    var expression = (source.match(/var x = (.+?);/) || [])[1];
    document.write(expression);

答案 5 :(得分:1)

您的浏览器完全抛弃12/2,只记得6。您可以看到此操作:在您的控制台中输入12/2<enter>以及发生的情况。

你需要存储12/2。 可能将其存储为字符串。

var stringVersion = '12/2';
var numberVersion = 12/2;
// The following are ways to get Javascript to convert the string to a number.
// They all come out to the value 12/2.
Number(stringVersion) === numberVersion; //true
+stringVersion === numberVersion; //true
eval(stringVersion) === numberVersion; //true

通常eval会导致问题(例如安全攻击),但这里的说法很简单。在字符串上运行eval就像在控制台中输入字符串并对其进行评估一样。所以你可以在行动中看到文字&#34; 12/2&#34;转换为数字。