javascript - 如何在javascript中使一个变量成为另一个变量的数学函数
问题描述
我的意思是数学意义上的标题中的问题。给定变量 x 和 y,它们可以通过方程 y=f(x) 关联,其中 f 是某个数学函数。这意味着当 x=2 时,y=f(2),当 x=-5 时,y=f(-5),依此类推。在数学环境中这是一件很自然的事情,我希望有一种简单的方法可以在 javascript 中实现这种行为。具体来说,让我们想象函数 f(x)=2x。我们可以在代码中实现这一点
function f(x){
return 2*x
}
但以下行为是默认行为
x=3
y=f(x)
y // returns 6
x=4
y // still returns 6
即使我们最初写了 y=f(x),这种关系也不会随着 x 的变化而持续存在。
我想这个问题的一个更简单的版本是当 f 只是恒等函数并且我们使用 y=x 时。你可以写 y=x,改变 x,并且 y 仍然是 x 的旧值,这取决于 x 是否持有原始值或参考值以及我们如何更改 x 的值。
似乎为了复制一个值以使关系 y=x 持续存在,我们必须(1)通过引用复制它和(2)通过 point.xCoord = 6 更改值,以免弄乱引用信息。我想知道是否有这样的解决方案通常适用于 y=f(x) 而不仅仅是 y=x。
我现在使用的解决方法是将 x 存储在一个对象中,该对象还跟踪依赖于它的值,并且仅通过调用也更新依赖于 x 的每个值的方法来更新 x。这感觉像是一个丑陋的解决方案,所以我想知道是否有更好的方法。
解决方案
您要问的根本不是 JavaScript 变量的工作方式。从长远来看,我认为您可能会从研究函数式编程概念和使用不可变变量中受益。
但是,可以通过将函数封装在对象方法中来创建类似于您描述的内容,特别是valueOf
andtoString
方法,它们在 JavaScript 中具有特殊含义。
例如:
const track = (f) => ({ valueOf: f , toString: () => f().toString() });
let x = 7;
let y = 8;
const z = track(() => x * x + 2 * y);
// further derive a value using z
const a = track(() => z - x);
console.log(`*** x = ${x}, y = ${y} ***`);
console.log('z =', z.valueOf());
// valueOf() is implicitly evaluated if the variable is used
// in a mathematical expression
console.log('z * 2 =', z * 2);
console.log('a =', a * 1);
// coerce to a string value
console.log(`z = ${z}, a = ${a}`);
// change x
x = 5;
console.log(`*** x = ${x}, y = ${y} ***`);
console.log('z * 2 =', z * 2);
console.log('a =', a * 1);
// change y
y = 50;
console.log(`*** x = ${x}, y = ${y} ***`);
console.log('z * 2 =', z * 2);
console.log('a =', a * 1);
// compare using valueOf()
const equals = (l, r) => l.valueOf() === r.valueOf();
console.log('equals(a, 120)', equals(a, 120));
console.log('equals(a, 125)', equals(a, 125));
推荐阅读
- c++ - 如何使用模板构造函数定义推导指南?
- node.js - React Native - 如何使两个设备在连接到同一网络时相互通信?
- php - 如何为我的联系表创建确认页面?
- ruby - ActiveRecord::StatementInvalid: 找不到表'users' Rails 5 教程
- python - 当我的玩家在pygame中碰撞时如何让我的玩家穿过敌人?
- r - 如何在 R 中将“foreach”和“%dopar%”与“R6”类一起使用?
- sql - 如何通过并发查询确保跨多个相关表的数据一致性
- assembly - TEST指令如何检查汇编语言中的数字是偶数还是奇数
- c# - 在经典云服务中使用 ActiveDirectoryMembershipProvider,但不适用于 Azure Web App
- python - 如何在 CherryPy 中使用 URL 正则表达式?