Javascript 为什么条件语句中的增量运算符给出类对象的编译错误?

Javascript 为什么条件语句中的增量运算符给出类对象的编译错误?,javascript,java,Javascript,Java,条件语句中的增量运算符在与类对象一起使用时出现编译错误 下面的语句没有错误: a = a==0 ? 1 : ++a; 但是,此语句给出编译错误: obj.setValue(obj.getValue()==0 ? 1 : ++obj.getValue()); ++和-运算符只能与可以出现在赋值=(assignment=)左侧的表达式一起使用。不能将函数调用放在赋值的左侧,因此不能将++应用于函数调用 我所说的这类表达式的一个正式术语是l值。这项工作: var x = 0; x++; 因为x作

条件语句中的增量运算符在与类对象一起使用时出现编译错误

下面的语句没有错误:

a = a==0 ? 1 : ++a;
但是,此语句给出编译错误:

obj.setValue(obj.getValue()==0 ? 1 : ++obj.getValue());
++和-运算符只能与可以出现在赋值=(assignment=)左侧的表达式一起使用。不能将函数调用放在赋值的左侧,因此不能将++应用于函数调用

我所说的这类表达式的一个正式术语是l值。这项工作:

var x = 0;
x++;
因为x作为一个表达式是一个l值。这也适用于:

var x = { a: 0 };
x.a++;
因为x.a也是一个有效的l值

现在还应该指出,从技术上讲,有一种方法可以将函数调用用作l值:

因为value是用getter/setter对定义的,所以子表达式++obj.value将通过调用getter函数obj.value、递增返回值,然后调用setter函数来计算。当然,这并不真正否定一般规则,因为使用getter/setter函数的全部目的是允许简单的属性访问语法,同时涉及添加特殊语义的代码。

obj.getValue是由方法返回的值。这不是一个变量。因此,您不能应用任何更改操作数值的运算符,例如-、++、+=、=,等等

您可以使用:

obj.setValue(obj.getValue()==0 ? 1 : obj.getValue() + 1);
相反

或者,您可以将方法的返回值指定给变量,该变量可以递减:

int a = obj.getValue();
obj.setValue(a==0 ? 1 : ++a);

但是,没有理由使用预减量或后减量运算符,除非以后要使用减量变量。

因为obj.getValue是一个方法/函数


不能自动递增函数的返回值必须首先将其分配给变量,并且自动递增将应用于该变量

为什么会出现这种情况?您可以获取一个默认值,然后添加一个

obj.setValue((obj.getValue() || 0) + 1);

不能使用++增加方法返回的值

使用

而不是

++obj.getValue()

正如其他答案所提到的,这是因为++和-运算符不能应用于函数

但是再看一下代码,为什么要检查obj.getValue==0

如果该值为0,则只需像任何其他数字一样递增


obj.setValueobj.getValue+1

您需要选择Java或JavaScript。两个标签都有会让人困惑,并且容易引发人们的注意。++obj.getValue是罪魁祸首,你不能在方法上使用++运算符。如果obj.getValue==0,obj.getValue的结果是什么?@Nina Scholz没有结果,因为代码在执行之前给出了编译错误。我认为这不会编译,因为逻辑OR不适用于Java中的int。它是javascript标记的。。。也在js中,如果obj.getValue返回一个值或一个数字,它应该可以工作,但是谁知道呢……我认为js标记是不正确的。OP提到编译错误表明这是Java,我认为这是解决OP问题的最好办法。
obj.getValue() + 1
++obj.getValue()