以下僅為個人閱讀筆記,您可以抱著看看就好的心態閱讀
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
----