摘要:引子今天同事聊天群里發(fā)現(xiàn)了一道面試題基礎(chǔ),但答案基本沒(méi)有幾個(gè)能答對(duì)并且理解的很透徹的。但是此時(shí)這個(gè)內(nèi)存區(qū)并沒(méi)有被回收因?yàn)樽兞康闹羔樢廊恢赶蛩?。并且因?yàn)橹熬吐暶髁藢傩运栽搩?nèi)存區(qū)增加了屬性。那么屬性指向哪兒呢它的返回值就是的內(nèi)存區(qū)。
引子
今天同事聊天群里發(fā)現(xiàn)了一道面試題(js基礎(chǔ)),但答案基本沒(méi)有幾個(gè)能答對(duì)并且理解的很透徹的。
問(wèn)題var a = {n: 1}; var b = a; a.x = a = {n: 2}; console.log(a.x); console.log(b.x);
先不說(shuō)答案,可能有些人已經(jīng)答錯(cuò)了~
錯(cuò)誤的答案這多簡(jiǎn)單!JS賦值運(yùn)算右結(jié)合!那就分開(kāi)算唄!
a = {n: 2} a.x = a
然后錯(cuò)誤的答案就這么產(chǎn)生了,a.x = {n: 2}
正解其實(shí)這道題看似簡(jiǎn)單但還是有一些繞,我依稀記得高中數(shù)學(xué)老師那句經(jīng)典的口頭禪!
遇到難題:畫(huà)圖啊!
好吧,這句話可能我會(huì)受用一輩子,同時(shí)也送給看這篇文章的同學(xué),希望能給你們編程帶來(lái)一些新的思路。
var a = {n: 1}; var b = a;
畫(huà)圖
這句話也是關(guān)鍵所在
a.x = a = {n: 2};
畫(huà)圖
根據(jù)js引擎語(yǔ)法解析,會(huì)先去從左到右尋找有沒(méi)有未聲明的變量,如果有就把該變量提升至作用域頂部并聲明該變量。那么恭喜js引擎他找到a.x這個(gè)屬性沒(méi)有聲明,那么他會(huì)在{n: 1}這個(gè)內(nèi)存區(qū)聲明一個(gè)x屬性等待賦值!
語(yǔ)法解析完成后,開(kāi)始進(jìn)行運(yùn)算(ps:賦值運(yùn)算),首先將a變量的指針指向了一個(gè)新的內(nèi)存區(qū){n: 2},那么a變量脫離了對(duì)內(nèi)存區(qū){n: 1}的引用關(guān)系。
但是此時(shí){n:1 }這個(gè)內(nèi)存區(qū)并沒(méi)有被GC回收因?yàn)閎變量的指針依然指向它。并且因?yàn)橹熬吐暶髁藊屬性所以該內(nèi)存區(qū)
增加了X屬性。那么X屬性指向哪兒呢?a.x = a = {n: 2}它的返回值就是{n: 2}的內(nèi)存區(qū)。
如下圖:
那么根據(jù)圖上可得:
a.x 不存在,故: => undefined(ps:因?yàn)镴S的缺陷這里應(yīng)當(dāng)報(bào)個(gè)錯(cuò)啥的~ Undefind reference)
b.x => {n: 2}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/81737.html
摘要:值類型中值的類型可簡(jiǎn)單分為三類,即基礎(chǔ)類型復(fù)雜類型特殊類型。復(fù)雜類型是指即廣義的對(duì)象類型,可由多個(gè)簡(jiǎn)單類型的值的合成,可以看作是一個(gè)存放各種值的容器。值類型賦值舉例引用類型賦值舉例 JS值類型 JS中值的類型可簡(jiǎn)單分為三類,即基礎(chǔ)類型、復(fù)雜類型、特殊類型。ES5中有6種數(shù)據(jù)類型:null,undefined,number,string,boolean,object。復(fù)雜類型是指obje...
摘要:先說(shuō)下這個(gè)老話題連續(xù)賦值例結(jié)果是什么這句簡(jiǎn)單,而這句呢答案是,變成了全局變量了這是實(shí)際執(zhí)行順序未使用聲明,所以變?nèi)肿兞苛死茉缫郧暗拿嬖囶}目了,相信很多人知道答案,考點(diǎn)詞法分析執(zhí)行順序運(yùn)算符優(yōu)先級(jí)等這是我理解的實(shí)際執(zhí)行順序我是這么猜想的自 先說(shuō)下這個(gè)老話題:連續(xù)賦值 例1: function a(){ var o1 = o2 = 5; } a(); console.l...
摘要:不過(guò)讓流行起來(lái)的原因應(yīng)該是是目前所有主流瀏覽器上唯一支持的腳本語(yǔ)言。經(jīng)過(guò)測(cè)試,數(shù)字字符串布爾日期可以直接賦值,修改不會(huì)產(chǎn)生影響。再考慮對(duì)象類型為或者的情況。對(duì)于結(jié)果聲明其類型。判斷對(duì)象的類型是還是,結(jié)果類型更改。 轉(zhuǎn)載自我的個(gè)人博客 歡迎大家批評(píng)指正 1. 第一個(gè)頁(yè)面交互 這里最需要學(xué)習(xí)的老師的代碼中,每一部分功能都由函數(shù)控制,沒(méi)有創(chuàng)建一個(gè)全部變量。且最后有一個(gè)函數(shù)來(lái)控制執(zhí)行代碼...
摘要:最近發(fā)現(xiàn)很多同學(xué)的博客里都會(huì)解釋連續(xù)賦值問(wèn)題,各種概念輩出,特別是對(duì)于不理解的同學(xué)來(lái)說(shuō),更加一頭霧水,我這里做個(gè)簡(jiǎn)單解釋,也許不懂的一看就明白了。 最近發(fā)現(xiàn)很多同學(xué)的博客里都會(huì)解釋js連續(xù)賦值問(wèn)題,各種概念輩出,特別是對(duì)于不理解的同學(xué)來(lái)說(shuō),更加一頭霧水,我這里做個(gè)簡(jiǎn)單解釋,也許不懂的一看就明白了。 先拋出一個(gè)問(wèn)題: var a = {c:1} //第一步 var b =...
摘要:值類型基本類型和棧內(nèi)存值類型也稱為原始數(shù)據(jù)或原始值這類值存儲(chǔ)在棧內(nèi)存中基本類型的值不可以修改。目前中的基本類型一共有六種。堆的使用規(guī)則當(dāng)創(chuàng)建數(shù)組時(shí),就會(huì)在堆內(nèi)存中創(chuàng)建一個(gè)數(shù)組對(duì)象,并且在棧內(nèi)存中創(chuàng)建一個(gè)對(duì)數(shù)組的引用。 值類型(基本類型)和棧內(nèi)存 值類型也稱為原始數(shù)據(jù)或原始值(primitive value).這類值存儲(chǔ)在棧(stack)內(nèi)存中, 基本類型的值不可以修改。每當(dāng)我們定義一個(gè)...
閱讀 1798·2021-11-24 10:18
閱讀 2313·2021-11-18 13:20
閱讀 2405·2021-08-23 09:46
閱讀 1085·2019-08-30 15:56
閱讀 2908·2019-08-30 15:53
閱讀 820·2019-08-30 14:22
閱讀 543·2019-08-29 15:34
閱讀 2595·2019-08-29 12:14