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