Wac*_*per 15 javascript expression variable-assignment getter-setter
我有以下代码:
var o = {};
o.a = 1;
var _value = 1;
Object.defineProperty(o,"a",{
set: function(value){
_value = value + 1;
console.log("log: ", value, _value);
return _value;
},
get: function(){
return _value;
}
});
Run Code Online (Sandbox Code Playgroud)
在setter函数中,我在返回之前将_value递增1.所以,如果我做oa = 5,我希望控制台打印6.(尽管我意识到从setter返回一个值通常没有意义)但是,如下面的代码片段所示,控制台打印5:
> o.a = 5;
log: 5 6 // from console.log;
5 // return; why does it == value and not value + 1?
> o.a;
6
> var i = o.a = 5;
> i;
5
> o.a;
6
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,为什么它会返回5而不是6?我希望这不是因为我在代码中犯了一些愚蠢的错误.
让我们看看简单的任务:
11.13.1简单分配(=)
生产AssignmentExpression:LeftHandSideExpression = AssignmentExpression的计算方法如下:
- 让lref成为评估LeftHandSideExpression的结果.
- 让rref成为评估AssignmentExpression的结果.
- 设rval为GetValue(rref).
因此rval
分配了将分配给左侧(o.a
)的值.在你的情况下5
.
- 如果满足以下条件,则抛出SyntaxError异常:[...]
- 调用PutValue(lref,rval).
这是将值分配给左侧(PutValue(o.a, 5)
)的位置.正如你所看到的,什么都没有做什么PutValue
回来(它没有返回任何东西).
- 返回rval.
在您的情况下,它简单地返回已分配的值5
.
赋值表达式始终返回已分配的值.