如果我重复一个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; })
此外,传递给 do
的 next
函数的 return 值被忽略,因此 return
是多余的。
或者,您可以使用后缀 ++
运算符并将赋值放到 x.index
:
do(x => isNaN(x.index) ? x.index = 0 : x.index++)
据我了解,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; })
此外,传递给 do
的 next
函数的 return 值被忽略,因此 return
是多余的。
或者,您可以使用后缀 ++
运算符并将赋值放到 x.index
:
do(x => isNaN(x.index) ? x.index = 0 : x.index++)