2014年1月10日 星期五

Node.js call by reference實驗

操作node.js時候,針對變數操作call by value或reference的一些迷思...來證明一下...

新增加a與b物件,兩者賦予同樣的值,但是實際物件並不相等
$ node
> a={aaa:111,bbb:333}
{ aaa: 111, bbb: 333 }
> b={bbb:333,aaa:111}
{ bbb: 333, aaa: 111 }
> a===b
false
> a==b
false
>

物件內容給予string也是一樣...
> a={aaa:'111',bbb:'222'}
{ aaa: '111', bbb: '222' }
> b={aaa:'111',bbb:'222'}
{ aaa: '111', bbb: '222' }
> a
{ aaa: '111', bbb: '222' }
> b
{ aaa: '111', bbb: '222' }
> a==b
false
> a===b
false
>

實際上物件是以call by reference存在...
因此如果使用b=a賦予b值,則兩個物件實際上是同一個...
> a={aaa:111,bbb:222}
{ aaa: 111, bbb: 222 }
> b=a
{ aaa: 111, bbb: 222 }
> a==b
true
> a===b
true
>

證明call by reference...
如果用b賦予a值,則當a改變時候
b也會跟著改變
> a=b
{ aaa: 333, bbb: 222 }
> a
{ aaa: 333, bbb: 222 }
> b
{ aaa: 333, bbb: 222 }
> a.ccc=123
123
> a
{ aaa: 333, bbb: 222, ccc: 123 }
> b
{ aaa: 333, bbb: 222, ccc: 123 }
> a==b
true
> a===b
true
>