gpt4 book ai didi

javascript - 对对象进行赋值操作

转载 作者:数据小太阳 更新时间:2023-10-29 04:17:12 24 4
gpt4 key购买 nike

示例 JSFiddle,以便您更好地了解正在发生的事情 http://jsfiddle.net/brsXL/3/ (打开控制台并查看记录的 vars 对象)。

我正在为 JavaScript 中的特定数学子集构建一个解析器和计算机,它将表达式作为来自用户的字符串并允许他们使用变量。为了保持我的计算逻辑简单但允许使用变量,我创建了一个对象,它的行为类似于数字,但具有通过引用传递的好处。

var Variable = function(value) {
this.value = value || null;
}
Variable.prototype.valueOf = function() {
return this.value;
}

这样做是为了:

var a = new Variable(10);
console.log(a + 2); // = 12
console.log(a / 2); // = 5

但是,只要我希望执行任何形式的赋值操作,例如 +=,对象就会丢失,并被针对对象的值属性的操作结果所取代。例如

var a = new Variable(10);
console.log(a += 2); // = 12
console.log(a); // = 12

我需要它这样工作的原因是因为我想使用相同的函数来处理数字和变量。我可以为每个赋值操作添加代码,但这对我来说不是最优的,例如

var ops = {
"+=" : function(a, b) {
if (a instanceof Variable) {
a.value += b;
} else {
a += b;
}
return a;
},
...
}

但我更愿意这样写:

var ops = {
"+=" : function(a, b) {
return a += b;
},
...
}

这可以做到吗?

最佳答案

I'd much rather write:

function(a, b) {
return a += b;
}

Can this be done?

没有。不可能将引用值作为单个变量传递。您总是需要使用对象属性。 a 在您的函数中始终是局部范围的,因此更改它不会影响外部世界。而且我不鼓励你尝试让你的运算符函数在更高范围的变量上运行......

我认为在您的情况下,对变量使用显式测试非常好,因为赋值运算符必须实际执行此操作。您不能分配给文字或其他值,只能分配给变量。甚至可能是

var ops = {
"=" : function(a, b) {
if (a instanceof Variable) {
a.value = +b; // cast b to a number (from whatever it is)
return a;
} else {
throw new Error("Invalid assignment to non-variable "+a);
}
},
...
}

此外,为避免代码重复,您可能不会写出所有复合赋值运算符。以通用方式定义它们:

["+", "-", "*", "/"].forEach(function(op) {
ops[op+"="] = function(a, b) {
return ops["="].call(this, a, ops[op].call(this, a, b));
};
});

( Updated jsfiddle demo )

关于javascript - 对对象进行赋值操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19530176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com