var a = [
{
name: 'is_empty',
items: ['1', '2', '3', '4', '5']
},
{
name: 'is_true',
items: ['6', '7', '8', '9', '10']
}
]
var b = []
for (var i = 0; i < a.length; i++) {
b[i] = a[i]
}
// 注釋掉a[0] = [], 此時(shí)B 為{[], ['1', '2', '3', '4', '5']}
// 未注釋掉的情況下,B為{[1, 2, 3, 4, 5]}, {[6, 7, 8, 9, 10]}
// a[0] = []
// console.log(b) // {['6', '7', '8', '9', '10']}, {['6', '7', '8', '9', '10']}
// a[0].items = []
// console.log(b) // {[], [6, 7, 8, 9, 10]}
重置a[0] = []
的時(shí)候,數(shù)組的引用被切斷了,但是如果只重置a[0].items = []
時(shí)候,引用卻并未被切斷,這是為什么?
假設(shè)這有個(gè)數(shù)組[{},{}](就是你上面a引用的那個(gè),我簡寫吧)
a是它的指針,指向這個(gè)數(shù)組所在的地址
然后你創(chuàng)建了一個(gè)變量b,把那個(gè)數(shù)組里面的元素地址放到了b里面,因?yàn)槟莻€(gè)數(shù)組里面的元素是對(duì)象 所以b[i] = a[i]的操作也只是a[i]把某個(gè)地址賦值給了b[i]。他們都是一個(gè)指針。
下面進(jìn)入分支:
a[0] = []的情況:a[0] 本來是一個(gè)指向[{},{}]其中一個(gè)元素的指針,后被替換成[]空數(shù)組的指針。然后給這個(gè)指針?biāo)傅膶?duì)象(也就是空數(shù)組)添加了一個(gè)屬性item,這個(gè)屬性是一個(gè)空數(shù)組的指針。b還是指向[{},{}],沒有任何影響。
a[0] = []被注釋的情況:下一條語句 a[0].item = []。在這條語句執(zhí)行前,a[0]還是和b[0]一樣,是指向[{},{}]一個(gè)元素的指針。執(zhí)行這條語句之后,也就是a[0]指向的這個(gè)對(duì)象的item屬性被覆蓋為一個(gè)空數(shù)組的指針。但是b[0]指向的內(nèi)存地址還是沒有變的,還是跟a[0]一樣的。所以b[0].item也還是指向那一塊內(nèi)存,所以b[0].item = a[0].item = []。
(取屬性的操作會(huì)對(duì)對(duì)象所在內(nèi)存地址塊執(zhí)行操作,個(gè)人總結(jié)。。)
需要注意的地方就是 引用類型的賦值是把對(duì)象的地址傳遞給變量,讓變量成為它的指針。所以a[0] = b[0] 都一樣都指向[{},{}]的一個(gè)元素?;蛟S你之前很有心的先var b = []開辟了一個(gè)內(nèi)存。但是這個(gè)新的內(nèi)存里面存放的東西,都是指向[{},{}]的指針。也就是通篇涉及到的有三個(gè)地址塊。一個(gè)是存放a數(shù)組的地址,一個(gè)是存放b數(shù)組的地址,一個(gè)是[{},{}]的地址。
參考關(guān)鍵字:Call by sharing
附上例子希望能看懂:
歡迎指正,一起進(jìn)步。剛剛開始接觸可能描述不規(guī)范。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。