首页 > 解决方案 > 如何在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。这感觉像是一个丑陋的解决方案,所以我想知道是否有更好的方法。

标签: javascriptjavascript-objects

解决方案


您要问的根本不是 JavaScript 变量的工作方式。从长远来看,我认为您可能会从研究函数式编程概念和使用不可变变量中受益。

但是,可以通过将函数封装在对象方法中来创建类似于您描述的内容,特别是valueOfandtoString方法,它们在 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));


推荐阅读