亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

基本類型和引用類型是按照什么訪問的?老師可以詳細說說嗎?

我在書上看,說基本類型是按值訪問的,引用類型類型是按引用訪問的,但是好像在某些操作的時候,引用類型也是按值訪問的。按值訪問和按引用訪問有什么區別嗎?

正在回答

6 回答

準確的說,JavaScript是按共享傳遞的(call by sharing)。


對于基本類型,按共享傳遞與按值傳遞(call by value)無異,你可以理解為JavaScript基本類型是按值傳遞的。

例:

var?a?=?1;
function?foo(x)?{
????x?=?2;
}
foo(a);
console.log(a);?//?1,?未受x?=?2賦值所影響


而對于對象,較為特殊。我們可以修改對象中的屬性,而變量的值是對象的引用,例如:

var?obj?=?{x?:?1};
function?foo(o)?{
????o.x?=?3;
}
foo(obj);
console.log(obj.x);?//?3,?被修改了


但與按引用傳遞不同,修改形參o并不會影響obj.

var?obj?=?{x?:?1};
function?foo(o)?{
????o?=?100;
}
foo(obj);
console.log(obj.x);?//?1,?不會被o?=?100影響


為什么叫“按共享傳遞”呢?JavaScript的類型中,基本類型是不可變的(immutable),只有對象是可變的(mutable).

例如數字值100, 布爾值true, false,修改這些值并沒有什么意義。比較容易誤解的,是JavaScript中的string。但實際string值也是不可變的,例如:

var?str?=?"string";
str.substring(5);?//?"g"


在JavaScript中,任何看似對string值的"修改"操作,實際都是創建新的string值。

而對象就不一樣了,對象值是可變的。

var?obj?=?{x?:?1};
obj.x?=?100;
var?o?=?obj;
o.x?=?1;
obj.x;?//?1,?被修改
o?=?true;
obj.x;?//?1,?不會因o?=?true改變

例如這里定義變量obj,值是object,然后設置obj.x屬性為100。而后定義另一個變量,值仍然是這個object對象,此時obj和o兩個變量的值指向同一個對象(共享同一個對象的引用)。所以修改這個可變的對象,對obj和o都有影響,但修改obj變量的值(不再指向這個對象),不會影響到o。


所以這里既不是按值傳遞,也不是按引用傳遞。而是按共享傳遞。



參考資料:http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_value



5 回復 有任何疑惑可以回復我~
#1

Alpaca 提問者

謝謝老師!
2015-01-10 回復 有任何疑惑可以回復我~
#2

Alpaca 提問者

簡單說,就是修改對象屬性的值會產生影響,修改對象的值不會產生影響?
2015-01-10 回復 有任何疑惑可以回復我~
#3

Bosn 回復 Alpaca 提問者

雖然不太嚴謹,但大概是這個意思。對于五種基本類型,和call by value(按值傳遞)是一樣的,對于對象,函數傳入的參數變量不會受形參值的變化所影響,但如果值是對象,修改對象的內容(如修改對象屬性、調用方法)會影響到傳入的參數。因為傳入的參數和形參“共享”同一個對象。
2015-01-11 回復 有任何疑惑可以回復我~

更新下博文的地址:http://bosn.me/js/js-call-by-sharing/

0 回復 有任何疑惑可以回復我~

整理了一篇更詳細的文章:http://bosn.me/articles/js-call-by-sharing/

1 回復 有任何疑惑可以回復我~
#1

Alpaca 提問者

老師好認真!謝謝
2015-01-29 回復 有任何疑惑可以回復我~

http://dmitrysoshnikov.com/ecmascript/chapter-8-evaluation-strategy/

0 回復 有任何疑惑可以回復我~
var?obj?=?{x?:?1};
obj.x?=?100;
var?o?=?obj;
o.x?=?1;
obj.x;?//?1,?被修改
o?=?true;?//o放棄和obj共享x?:?1},去擁有true這個對象?typeof(o)?boolean


0 回復 有任何疑惑可以回復我~

回答的真好!

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

基本類型和引用類型是按照什么訪問的?老師可以詳細說說嗎?

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號