假设:
function a() {
return 1;
}
a()++;
我收到错误,这在JS中是不可能的吗?
我想要的是获得值2.
答案 0 :(得分:11)
你试图增加一个常量,这没有任何意义。
从本质上讲,你已经写过:
1++;
或
1 = 1 + 1
据我所知,这不适用于JavaScript或任何语言。当然,如果你试图这样做,Ruby,PHP和C ++都会同样死掉。
如果您想要达到值2
,则需要直接添加:
a() + 1
请注意,当您不尝试修改常量值时,函数解除引用会正常工作:
function a() { return [1, 2, 3]; }
a()[1]; // 2
function b() { return {name: "bob"} }
b().name; // "bob"
答案 1 :(得分:2)
否。问题在于++
(如+=
)仅适用于Reference Specification Type的表达式。
也就是说,++
与“变量或属性表达式”一起使用时仅 有效。
引用类型用于解释诸如delete,typeof和赋值运算符[包括
++
,+=
等]之类的运算符的行为。例如,赋值的左侧操作数应生成引用[规范类型表达式]。
var x
x++ // variable
// same as x = x + 1, when used as statement
((x))++ // totally legal, still an RST-expression
var o = {p: 0}
o.p++ // property
// same as o.p = o.p + 1, when used as statement
// while odd, still legal as the ++ applies to an RST-expression
var q
((q = {p: 0}).p)++ // q.p == 1, after
但是,函数调用表达式 never 会产生RST值,从而失败。 不是一个SyntaxError,并且生产是允许的,但是类型错误导致运行时ReferenceError异常。
// (modified to show it is a run-time exception not related to parsing)
function f () {
f()++ // whoops!
// same failure as f() = f() + 1
}
f();
函数只返回值(由求值表达式产生),但在JavaScript中有 no 可赋值表达式,它产生一个RST值 - 上述运算符“消耗”RST表达式并计算为非RST值。
原始问题is possible in C++的变体,支持创建显式引用。但是,在ECMAScript中,RST主要用于描述“l值行为”,但不会暴露。
#include <iostream>
using namespace std;
int x;
int& func() {
return x;
}
int main() {
func()++;
cout << x << endl;
func()++;
cout << x << endl;
return 0;
}