Quantcast
Channel: AJ Hsu
Viewing all articles
Browse latest Browse all 8

[閱讀筆記] JavaScript深入精要

$
0
0

 

以下僅為個人閱讀筆記,您可以抱著看看就好的心態閱讀

JavaScript內建的九種建構型別:

Number()

String()

Boolean()

Object()

Array()

Function()

Date()

RegExp()

Error()

----

String其實是字元陣列,並且可透過str[n]取得其第n個字元。

在值型別的部分,若使用以下方式

var s = new String();

var n = new Number();

var b = new Boolean();

將會產生複合物件(也就是其實是一種Object型別)。

若使用

var s = String();

var n = Number();

var b = Boolean();

則會是單純的數值。

兩者做===比較時,將不會相等。

----

可以用[object].constructor檢查其建構型別。

----

動態屬性(附加屬性)為物件特色,必須為物件時才能使用,如:

var s = new String();

s.hello = “everybody”; //OK

var s = “hi”;

s.hello = “everybody”; // Error

----

括號標記法

[object].hello = 123;

等同於 obj[‘hello’] = 123;

此項優點可用於索引對應當中。

----

delete關鍵字可以刪除屬性。

----

[object].hasOwnProperty()─可以檢查物件是否擁有指定屬性,但僅限於此型別中。

----

若要檢查到父類別,可使用關鍵字in,如:

console.log(key in obj);

檢查obj及其父類別是否含有key屬性。

----

使用for…in… 可以列出物件的所有屬性(包含父類別)

如:

for(p in window){

console.log(p);

}

就可以列出window物件的所有屬性。

----

Underscore.js可以擴充基礎的javascript功能

----

ar s = new Object();

s.x = 1;

s.y = 2;

s.z = 3;

等同於

var s = {

x: 1,

y: 2,

z: 3

};

----

Function

Instance Properties:

-arguments

-constructor

-length

Instance Methods:

-apply()

-call()

-toString()

(apply跟call僅差在參數傳遞方式不同,call為逗號分開,apply則以陣列傳地參數)

----

若Function不指定回傳值,則預設回傳undefined。

----

Function 中的arguments.callee()可以取得原呼叫函式。

----

argument.length代表實際傳入的參數數目(已被arguments.callee.length取代)。

[Function].length代表定義該傳入的參數數目。

----

自我呼叫

var f = function(){ console.log(); } ();

會立即呼叫函式。

也可以是

(function(){ console.log(); })();

也可以是

!function(){ console.log(); }();

----

提升(Hoisted)

var f = function();

無法在定義前被呼叫。

但function f(){};

可以在定義前被呼叫。

----

window物件(head物件)是一個代表全域的物件。

可藉由window呼叫,或者在全域中使用this呼叫。

----

當有任何變數或方法在全域範圍中,可藉由window.[obj]來取得。

也可以使用 [obj] in window檢查是否為全域變數。

----

在函式中的函式中使用this,會因為this迷路而取得window物件

所以如果要在第二層當中使用this,則需在第一層的時候先暫存this,如:

var f = function(){

var that = this;

var f2 = function(){

console.log(that);

}

}

----

不管在任何地方,若宣告不使用var,則視為全域。

----

每個Function一定有prototype物件(也等於__proto__物件)。

----

可以使用兩種方式追蹤prototype下面的物件:

1. 透過原型鏈:[object].foo;

2. 透過建構式:[object].constructor.prototype.foo;

----

若[object].prototype被覆寫之後,如 class.prototype = {} ,則會讓類別實體與原prototype定義中斷參考,不會再由其原型鏈更新。

----

再次筆記,

動態屬性

[instance].foo = “foo”;

或var Class = function(){

This.foo = “foo”;

}

都會取代prototype中定義的屬性。

----

屬性的呼叫順序:

動態屬性[instance].foo > 原型鏈的屬性 class.prototype.foo > 物件原型鏈的屬性 object.prototype.foo

----

繼承鍊

var Father = function(){};

var Son = function(){};

Son.prototype = new Father();

----

在JavaScript當中

null代表沒有值(人為的)

undefined代表沒有指定值,或尚未指定值(預設的)

----

因為typeof null 會等於 object,若要檢查是否為null,要使用 [instance] === null才能正確檢查是否為null。

----

在檢查null的時候一定要用三個等號檢查,因為兩個等號無法分辨null及undefined。

null == null; //true

null == undefined; //true

null === null; //true

null === undefined; //false

----


Viewing all articles
Browse latest Browse all 8