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