JS紅寶書學習記錄(二)

2021-10-08 04:46:24 字數 2878 閱讀 2170

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...