我有一个变量var x= 12/2
,我希望像12/2
而不是6
一样查看它。当我x.toString()
或String(x)
时,我将结果作为字符串。有没有办法按原样获取操作,而不是原始值不是字符串时的结果?
答案 0 :(得分:3)
当您实际执行如下语句时:
var x = 12 / 2;
您实际上丢失信息。丢失的信息是用于创建表达式结果的信息,即分子和分母。我们给你的最后一个结果是6
。
没有办法从该声明中恢复到原始表单,因为它可能是24/4
或594/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)
请勿这样做:
<script>
元素中运行currentScript
获取该元素text
获取源代码
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;转换为数字。