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的计算如下:

  • 让lref作为计算LeftHandSideExpression的结果
  • 设rref为赋值表达式求值的结果
  • 设rval为(rref)
  • 因此,
    rval
    被分配了将被分配到左侧的值(
    o.a
    )。在您的情况下
    5

  • 如果以下条件均为true,则引发SyntaxError异常:[……]
  • 呼叫(lref、rval)
  • 这是将值分配到左侧的位置(
    PutValue(o.a,5)
    )。正如您所看到的,对任何
    PutValue
    返回的内容都不做任何处理(它不返回任何内容)

  • 返回rval
  • 在您的情况下,它简单地返回分配的值
    5



    赋值表达式总是返回被赋值的值。

    就像@Thilo所说的,return in setter不起作用。您可以将
    return 100
    而不是
    return\u value
    放在setter中,您只能得到5(分配给
    i
    的值)。此答案解决了问题中提出的两个问题,而不仅仅是明确的问题。但是,请小心使用代理。在代理定义中,set()的返回值确实有意义-请参阅