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引擎所做的