如果我重复一个rxjs.Observable.of(obj),是否克隆了obj?为什么我不能修改它?

If I repeat a rxjs.Observable.of(obj), is obj cloned? Why I can't modify it?

据我了解,javascript 传递对象作为参考。所以如果我用一个对象作为参数调用一个函数,这个函数可以修改它。我写了这段代码:

var rxjs = require("rxjs")

var obj = {}

var stream = rxjs.Observable.of(obj).
do((x)=>{x.index=isNaN(x.index)?x.index=0:x.index++; return x}).
repeat(10).
subscribe(console.log);

obj上定义index 属性如果还不存在,如果已经存在则增加。因为我正在创建对象的可观察对象,所以可观察对象应该能够修改对象,对吧?所以我应该期望看到输出:

{index: 0}
{index: 1}
{index: 2}
...

但我看到了

{index: 0}
{index: 0}
{index: 0}
...

它不是克隆的,您可以根据需要修改它。

您的问题是后缀 ++ 运算符 return 是先前的值,因此分配给 x.index 的值将始终为零。请改用前缀 ++

do(x => { x.index = isNaN(x.index) ? x.index = 0 : ++x.index; return x; })

此外,传递给 donext 函数的 return 值被忽略,因此 return 是多余的。

或者,您可以使用后缀 ++ 运算符并将赋值放到 x.index:

do(x => isNaN(x.index) ? x.index = 0 : x.index++)