Javascript return语句在setter中做什么?
我有以下代码:Javascript return语句在setter中做什么?,javascript,expression,variable-assignment,getter-setter,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;
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;
}
});
在setter方法中,我将\u值
增加1,然后返回它。因此,如果我设置o.a=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
所以我的问题是为什么它返回5
,而不是6
我希望这不是因为我在代码中犯了一些愚蠢的错误。您不能从属性设置程序返回任何内容,而只是获取赋值的值(这是
5
,因为您赋值了5
)
二传手的回传是做什么的
没什么。最好删除
return
语句。充其量它会被忽略。赋值表达式的值始终等于被赋值的值:
var a;
console.log(a = 7); // logs 7
无论您分配给的对象是变量、普通属性、setter、只读属性还是其他类型,这都是正确的:
var a = {};
Object.defineProperty(a, "b", { value: 8, writable: false });
console.log(a.b = 9); // logs 9
console.log(a.b); // logs 8, because a.b is read-only
正如您自己所说的,setter中的返回值是没有意义的,所以当您在setter中使用返回值时,为什么您希望它实际执行任何特殊操作?回答您的问题“return语句在setter中做什么?”——基本上什么都没有。它计算返回右边的表达式,然后丢弃结果。让我们看看:
生产AssignmentExpression:LeftHandSideExpression=AssignmentExpression的计算如下:
rval
被分配了将被分配到左侧的值(o.a
)。在您的情况下5
PutValue(o.a,5)
)。正如您所看到的,对任何PutValue
返回的内容都不做任何处理(它不返回任何内容)
5
赋值表达式总是返回被赋值的值。就像@Thilo所说的,return in setter不起作用。您可以将
return 100
而不是return\u value
放在setter中,您只能得到5(分配给i
的值)。此答案解决了问题中提出的两个问题,而不仅仅是明确的问题。但是,请小心使用代理。在代理定义中,set()的返回值确实有意义-请参阅