課程
/前端開發
/JavaScript
/JavaScript深入淺出
我在書上看,說基本類型是按值訪問的,引用類型類型是按引用訪問的,但是好像在某些操作的時候,引用類型也是按值訪問的。按值訪問和按引用訪問有什么區別嗎?
2015-01-10
源自:JavaScript深入淺出 1-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
Alpaca 提問者
Bosn 回復 Alpaca 提問者
更新下博文的地址:http://bosn.me/js/js-call-by-sharing/
整理了一篇更詳細的文章:http://bosn.me/articles/js-call-by-sharing/
http://dmitrysoshnikov.com/ecmascript/chapter-8-evaluation-strategy/
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
回答的真好!
舉報
由淺入深學習JS語言特性,且解析JS常見誤區,從入門到掌握
6 回答請問我的理解:基本類型不是對象 所以沒有屬性和方法 但是基本類型卻可以用length()方法 是因為js自動的把基本類型轉化為對象 然后再用這個length方法 結束后再刪除這個對象 這么理解是正確的嗎
1 回答不是說“js一切皆對象”嗎?他為何說原始類型不是對象?
3 回答js六種類型,每個類型是什么意思?
9 回答NaN是屬于什么類型?
1 回答類型檢測有什么用處
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2015-01-10
準確的說,JavaScript是按共享傳遞的(call by sharing)。
對于基本類型,按共享傳遞與按值傳遞(call by value)無異,你可以理解為JavaScript基本類型是按值傳遞的。
例:
而對于對象,較為特殊。我們可以修改對象中的屬性,而變量的值是對象的引用,例如:
但與按引用傳遞不同,修改形參o并不會影響obj.
為什么叫“按共享傳遞”呢?JavaScript的類型中,基本類型是不可變的(immutable),只有對象是可變的(mutable).
例如數字值100, 布爾值true, false,修改這些值并沒有什么意義。比較容易誤解的,是JavaScript中的string。但實際string值也是不可變的,例如:
在JavaScript中,任何看似對string值的"修改"操作,實際都是創建新的string值。
而對象就不一樣了,對象值是可變的。
例如這里定義變量obj,值是object,然后設置obj.x屬性為100。而后定義另一個變量,值仍然是這個object對象,此時obj和o兩個變量的值指向同一個對象(共享同一個對象的引用)。所以修改這個可變的對象,對obj和o都有影響,但修改obj變量的值(不再指向這個對象),不會影響到o。
所以這里既不是按值傳遞,也不是按引用傳遞。而是按共享傳遞。
參考資料:http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_value
2015-01-29
更新下博文的地址:http://bosn.me/js/js-call-by-sharing/
2015-01-24
整理了一篇更詳細的文章:http://bosn.me/articles/js-call-by-sharing/
2015-10-19
http://dmitrysoshnikov.com/ecmascript/chapter-8-evaluation-strategy/
2015-03-30
2015-01-16
回答的真好!