基本類(lèi)型和引用類(lèi)型是按照什么訪問(wèn)的?老師可以詳細(xì)說(shuō)說(shuō)嗎?
我在書(shū)上看,說(shuō)基本類(lèi)型是按值訪問(wèn)的,引用類(lèi)型類(lèi)型是按引用訪問(wèn)的,但是好像在某些操作的時(shí)候,引用類(lèi)型也是按值訪問(wèn)的。按值訪問(wèn)和按引用訪問(wèn)有什么區(qū)別嗎?
我在書(shū)上看,說(shuō)基本類(lèi)型是按值訪問(wèn)的,引用類(lèi)型類(lèi)型是按引用訪問(wèn)的,但是好像在某些操作的時(shí)候,引用類(lèi)型也是按值訪問(wèn)的。按值訪問(wèn)和按引用訪問(wèn)有什么區(qū)別嗎?
2015-01-10
舉報(bào)
2015-01-10
準(zhǔn)確的說(shuō),JavaScript是按共享傳遞的(call by sharing)。
對(duì)于基本類(lèi)型,按共享傳遞與按值傳遞(call by value)無(wú)異,你可以理解為JavaScript基本類(lèi)型是按值傳遞的。
例:
而對(duì)于對(duì)象,較為特殊。我們可以修改對(duì)象中的屬性,而變量的值是對(duì)象的引用,例如:
但與按引用傳遞不同,修改形參o并不會(huì)影響obj.
為什么叫“按共享傳遞”呢?JavaScript的類(lèi)型中,基本類(lèi)型是不可變的(immutable),只有對(duì)象是可變的(mutable).
例如數(shù)字值100, 布爾值true, false,修改這些值并沒(méi)有什么意義。比較容易誤解的,是JavaScript中的string。但實(shí)際string值也是不可變的,例如:
在JavaScript中,任何看似對(duì)string值的"修改"操作,實(shí)際都是創(chuàng)建新的string值。
而對(duì)象就不一樣了,對(duì)象值是可變的。
例如這里定義變量obj,值是object,然后設(shè)置obj.x屬性為100。而后定義另一個(gè)變量,值仍然是這個(gè)object對(duì)象,此時(shí)obj和o兩個(gè)變量的值指向同一個(gè)對(duì)象(共享同一個(gè)對(duì)象的引用)。所以修改這個(gè)可變的對(duì)象,對(duì)obj和o都有影響,但修改obj變量的值(不再指向這個(gè)對(duì)象),不會(huì)影響到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
整理了一篇更詳細(xì)的文章: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
回答的真好!