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

Javascript 显示数学运算语法而不是结果,javascript,Javascript,我有一个变量var x=12/2,我想这样看待它12/2,而不是6。当我执行x.toString()或String(x)时,我得到的结果是String。当原始值不是字符串时,是否有方法按原样获取操作而不是结果 当原始值不是字符串时,是否有方法按原样获取操作而不是结果 否,因为12/2是一个表达式,在赋值发生之前进行求值。不能从结果中“反向工程”原始表达式 当原始值不是字符串时,是否有方法按原样获取操作而不是结果 否,因为12/2是一个表达式,在赋值发生之前进行求值。您不能从结果中“反向工程”原始

我有一个变量
var x=12/2
,我想这样看待它
12/2
,而不是
6
。当我执行
x.toString()
String(x)
时,我得到的结果是String。当原始值不是字符串时,是否有方法按原样获取操作而不是结果

当原始值不是字符串时,是否有方法按原样获取操作而不是结果

否,因为
12/2
是一个表达式,在赋值发生之前进行求值。不能从结果中“反向工程”原始表达式

当原始值不是字符串时,是否有方法按原样获取操作而不是结果


否,因为
12/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()的范围,这可能导致类似函数不易受到的攻击

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

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


只要调用
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()的范围,这可能导致类似函数不易受到的攻击

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

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


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

var x = 12 / 2;
你实际上丢失了信息。丢失的信息是用于创建表达式结果的信息,即分子和分母。你给我们的结果就是结果
6

无法从该语句返回原始形式,因为它很可能是
24/4
594/99

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

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

有很多rational库,但您可能希望找到一个可以让您选择不规范化数字的库,例如将
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

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

var x = 12 / 2;
你实际上丢失了信息。丢失的信息是用于创建表达式结果的信息,即分子和分母。你给我们的结果就是结果
6

无法从该语句返回原始形式,因为它很可能是
24/4
594/99

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

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

有很多rational库,但您可能希望找到一个可以让您选择不规范化数字的库,例如将
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

当您编写以下表达式时:

 var x = 12 / 2;
您正在编写一个需要求值的表达式。因此,这就是JS引擎所做的