1.標記清除
執行時標記所有變數,(書中提到了使用位作為標記去記錄變數進入還是離開了環境,這一點類似於作業系統中的位圖法),然後去除環境中的變數和環境中被變數引用(閉包的起因!!)的標記。之後再被標記的變數都是可清除變數,定時清理。
2.引用計數
跟蹤記錄每個值被引用的次數。這個跟檔案系統的硬鏈結數有點類似。
functionf(
)
定時清除引用次數為0的值,但是他會有很嚴重的乙個問題,那就是迴圈引用問題!!顧名思義,a的屬性賦值了b,b的屬性賦值了a。。。重大缺陷導致了js基本都是第一種策略了。順帶提一下ie8以前的bom和dom都是這種策略(基於c++編寫的com物件實現的,第一次聽到瀏覽器還有c++。是我低估了它了)
消除遞迴函式的緊密耦合:arguments.callee
bind():es5新增方法,建立函式例項,其this值傳給bind()函式的值。
var a=b.bind(c);// bd的this指標現在指向c了
基本包裝型別的概念:讀取基本型別時,會建立乙個對應的基本包裝型別的物件,從而讓我們能夠呼叫方法(如:『a』.split(),方法呼叫完畢後物件將會被銷毀)
ecma中有兩種屬性:(這裡的屬性是指物件的屬性特性)
1.資料屬性:
[[configurable]]:能否通過delete刪除屬性從而重新定義屬性;賦值false後,只能修改writable
[[enumerable]]:能夠for-in
[[writable]]:能否修改
[[value]]:屬性的資料值
var person=
// 此時name屬性的前三資料屬性都為true,value為1
object.
defineproperty
(person,
"age",)
// 此時age屬性的前三資料屬性都為false,value為undefined
2.訪問器屬性:
[[configurable]]:能否通過delete刪除屬性從而重新定義屬性;賦值false後,只能修改writable
[[enumerable]]:能夠for-in
[[get]]:讀值函式
[[set]]:寫值函式
var book=
object.
defineproperty
(book,
"year",}
})//前兩個值沒定義,預設為false
book.year=
2005
;=>
2005
book.edition// 被更改了,資料繫結了
=>
2book._year //被更改了,資料繫結了
=>
2005
使用object.getownpropertydescriptor()方法即可訪問屬性的特性。
object.getprototypeof():返回原型
object.hasownproperty():檢測屬性處於原型(false)還是例項(true)
object.keys():獲取所有可列舉例項屬性的字串陣列
object.getownpropertynames():獲取所有例項屬性的字串陣列(包括不可列舉如:constructor,設定[[enumerable]]為false的屬性)
new操作符的四個步驟(面試):
建立乙個新的物件
將建構函式的作用域賦值給新物件(this指向新物件)
執行建構函式中的**(新增屬性)
返回新物件
面試老話題,不多講,反而我想問下,那如果我不用new操作符呢?此時的建構函式會怎麼樣呢?
為什麼有這個疑問,是因為在書上看到了乙個例子,乙個概念:
穩妥建構函式
構建乙個沒有公共屬性,而且其方法也不引用this的物件。
consta=
(name,age,job)
=>
;return o;
}=>undefined
var test=a(
'he',29
,"driver");
=>undefined
test.
getname()
//獲取到了
=>
'he'
test._***//私有變數,不允許訪問,其實該變數也早已經銷毀,至於在暴露出來的getname()處使用了私有變數,那就是乙個經典的閉包了,第七章再說
=>undefined
可以看到,不是用new操作符的話,如果沒有return值的話,作用域內的變數其實在執行完後已經全部銷毀了。若是返會物件的話,也只是返回物件上的屬性,不包括作用域內的屬性。
不多複述,網上都有
原型鏈繼承
缺點:例項共享原型上的屬性方法
構造繼承
function
subtype()
缺點:方法在建構函式中定義,函式復用無從談起
原型鏈構造組合繼承
缺點:呼叫兩次超類建構函式
原型式繼承
object.create()
寄生式繼承
寄生組合式繼承
js犀牛書,學習心得筆記(一)
最近每天都抽出時間看犀牛書,明顯可以感覺到和以前看的時候有差別,閱讀能力和心得有了很大的提公升,以前不明白的一些知識點,還有一些隱藏在細節中的知識,現在都可以領悟到了。1 包裝物件 暫時性的包裝物件 js資料型別分為原始資料型別和引用資料型別,原始型別包含number,string,boolean等...
JS學習記錄
首先,使用indexof查詢陣列元素下標,本來是正常可以返回的。但是因為陣列是由物件組成,物件是不能用簡單的 或者 來比較相等的。兩個object型別物件,即使擁有相同屬性 相同值,但是因為他們在記憶體裡的位置是不同的,所以是不相等的。這個是區別於其他的基本型別,基本型別是通過值比較的。所以在使用i...
JS學習記錄(DOM部分)
dom部分 getelement系列方法 en jereh 傑瑞集團 jredu 傑瑞教育 jredu 傑瑞教育 change 變!change2 變!change3 全部字型變大!結果圖 attribute en img tu.png alt id img geturl 獲取路徑資訊 change...